有什麼好的庫來處理android活動中的多個異步調用?我正在尋找一個庫,其中所有的調用都被執行,並且當所有調用都已經完成時返回結果。Android多個異步調用
1
A
回答
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
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();
}
相關問題
- 1. ios - 多個異步調用
- 2. 多個Ajax異步調用
- 3. 多個異步調用
- 4. 將多個異步調用
- 5. 進步多個異步跟蹤調用
- 6. 處理多個調用異步回調
- 7. Android Okhttp異步調用
- 8. 的NodeJS多個異步調用
- 9. 茉莉 - 多是,一個異步調用
- 10. Node.js - 等待多個異步調用
- 11. XMLRPCPP異步處理多個調用?
- 12. 等待多個異步調用完成?
- 13. Angular 2調用多個異步方法
- 14. 調用一個異步函數多次
- 15. C++中的多個異步調用
- 16. 多個異步調用阻塞
- 17. 來自flex的多個異步調用
- 18. 多個衛兵調用異步功能
- 19. 在內部有多個異步調用的異步WCF服務
- 20. 異步調用
- 21. 異步調用
- 22. 異步調用
- 23. 異步調用和異步io調用之間的差異.net
- 24. Android的異步服務調用策略
- 25. 使異步調用同步
- 26. 同步異步API調用
- 27. 使異步調用同步
- 28. 來自異步ASP.NET頁面的多個順序異步Web服務調用?
- 29. 調用異步方法多次
- 30. 異步JAX-WS多次調用
指定你的意思是什麼類型的呼叫。 –
任何其他API調用 – Girish
https://github.com/path/android-priority-jobqueue –