2016-08-15 5 views
1

Есть ли хорошая библиотека для обработки нескольких асинхронных вызовов в андроид-активности? Я ищу библиотеку, где выполняются все вызовы, и результат возвращается, когда все они завершены.Несколько асинхронных вызовов Android

+0

Укажите, какой тип вызовов вы имеете в виду. –

+0

Любые остальные вызовы api – Girish

+0

https://github.com/path/android-priority-jobqueue –

ответ

0

Есть тонны способов сделать это, и (как и другие предложили) RxJava, вероятно, один из самых простых, но мальчик ... научиться RxJava только для такой простой задачи звучит как такой перебор.

Вот простой класс (расширение AsyncTask), который поможет вам сделать это легко:

public static abstract class Task<Param, Progress, Result> extends AsyncTask<Param, Progress, Result> { 

    public abstract static class Watcher { 

     private List<Long> watchedIds = new ArrayList<>(); 
     private boolean finished = false; 

     public abstract void onAllTasksFinished(); 

     private void checkIfFinished() { 
      if (finished) { 
       throw new IllegalStateException("This Watcher is already finished. Create a new one."); 
      } 
     } 

     private void watch(Task task) { 
      checkIfFinished(); 
      task.setWatcher(this); 
      watchedIds.add(task.getId()); 
     } 

     private void onFinished(Task task) { 
      checkIfFinished(); 
      watchedIds.remove(Long.valueOf(task.getId())); 
      if (watchedIds.size() == 0) { 
       onAllTasksFinished(); 
      } 
     } 
    } 

    private static long idGenerator = 0; 

    private final long id = idGenerator++; 
    private Watcher watcher; 

    private void setWatcher(Watcher watcher) { 
     this.watcher = watcher; 
    } 

    private long getId() { 
     return id; 
    } 

    @Override 
    protected final void onPostExecute(Result o) { 
     onTaskFinished(o); 
     if (watcher != null) { 
      watcher.onFinished(this); 
     } 
    } 

    protected abstract void onTaskFinished(Result o); 
} 

Использование:

// Create a Watcher object 
Task.Watcher watcher = new Task.Watcher() { 
    @Override 
    public void onAllTasksFinished() { 

    } 
}; 

// Create your tasks (you can extend Task class if that fits your needs better) 
Task<String, Object, Date> task1 = new Task<String, Object, Date>() { 
    @Override 
    protected void onTaskFinished(Date o) { 

    } 

    @Override 
    protected Date doInBackground(String... params) { 
     return null; 
    } 
}; 
Task<Long, Integer, String> task2 = new Task<Long, Integer, String>() { 
    @Override 
    protected void onTaskFinished(String o) { 

    } 

    @Override 
    protected String doInBackground(Long... params) { 
     return null; 
    } 
}; 

// Watch tasks in your Watcher object 
watcher.watch(task1); 
watcher.watch(task2); 

// execute tasks (in any way you like ;)) 
0

Вы должны определенно изучить RxJava. Это позволяет вам испускать вещи из одной точки, делать много перекрестков в вашем потоке между ними (если вам нужно) и получать уведомление на сайте наблюдателя. Он также позволяет легко переключаться между потоками (в сочетании с RxAndroid).

0

Я реализовал это недавно с помощью ExecutionerCompletionService. Метод take() - это та часть, которая ждет. Ссылка здесь, а пример кода - ниже.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorCompletionService.html

final ExecutorService pool = Executors.newFixedThreadPool(2); 
    final ExecutorCompletionService<Object> completionService 
      = new ExecutorCompletionService<>(pool); 

    completionService.submit(new Callable<Object>() { 
     @Override 
     public Object call() throws Exception { 
      return doApiCallOne(); 
     } 
    }); 

    completionService.submit(new Callable<Object>() { 
     @Override 
     public Object call() throws Exception { 
      return doApiCallTwo(); 
     } 
    }); 

    try { 
     final Future<Object> future1 = completionService.take(); 
     final Future<Object> future2 = completionService.take(); 
     final Object wrapper1 = future1.get(); 
     final Object wrapper2 = future2.get(); 

     final Type1 model1; 
     final Type2 model2; 
     if (wrapper1 instanceof Type1) { 
      model1 = (Type1) wrapper1; 
      model2 = (Type2) wrapper2; 
     } else { 
      model1 = (Type1) wrapper2; 
      model2 = (Type2) wrapper1; 
     } 

    } catch (ExecutionException | InterruptedException e) { 
     event.setResult(false); 
     event.setException(e); 
     e.printStackTrace(); 
    }