Есть ли хорошая библиотека для обработки нескольких асинхронных вызовов в андроид-активности? Я ищу библиотеку, где выполняются все вызовы, и результат возвращается, когда все они завершены.Несколько асинхронных вызовов Android
ответ
Есть тонны способов сделать это, и (как и другие предложили) 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 ;))
Попробуйте один
https://github.com/SilenceDut/AsyncTaskScheduler
Эта библиотека имеет опции для управления несколькими задачами легко, а также управлять обратного вызова в UI потоке.
Вы должны определенно изучить RxJava. Это позволяет вам испускать вещи из одной точки, делать много перекрестков в вашем потоке между ними (если вам нужно) и получать уведомление на сайте наблюдателя. Он также позволяет легко переключаться между потоками (в сочетании с RxAndroid).
Я реализовал это недавно с помощью 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();
}
Укажите, какой тип вызовов вы имеете в виду. –
Любые остальные вызовы api – Girish
https://github.com/path/android-priority-jobqueue –