假设我们有两个HTTP异步调用,任务1和任务2.我想在同一时间执行它们。一旦两者都完成,我想触发一个功能。
由于我们不知道哪个任务将首先完成,我们如何知道任务已完成并触发该功能?
答案 0 :(得分:2)
如何控制触发器:您可以开发一个接口并将其实现为AsyncTask
,在此接口上您可以定义一个回调,该回调将在{{1}中调用您onPostExecute
的方法为here。
如何执行2个或更多AsyncTask
s 以执行2个或更多AsyncTask
个,您可以查看这些链接
link1
Link2
亲切的问候
答案 1 :(得分:1)
如果你是在" parallel"唯一的方法是设置"完成"每个任务的标志,然后在每个任务结束时检查是否所有其他标志都已完成"这样你就知道你准备继续前进了;
然而,这种方法有点混乱并导致意大利面条代码,所以,如果你真的不需要" parallel"在解决方案的过程中,您始终可以创建一个"异步队列",它将异步执行每个任务一个,您可以跟踪队列的大小,从而注意到它何时到达终点管道。
希望它有帮助!
问候!
答案 2 :(得分:1)
创建一个字段以跟踪已完成的任务数,然后当每个任务完成增量值并检查完成的数字是否与所需数量匹配时:
private int mTasksComplete = 0;
private int mTasksRequired = 2;
public void completeTask(){
++mTasksComplete;
if(mTasksComplete == mTasksRequired){
//do something
}
}
答案 3 :(得分:1)
步骤1:创建界面TaskComplete,
public interface TaskComplete {
public void TaskDone(String asyncClassName);
}
步骤2:在您调用异步任务的类中创建它的对象。
TaskComplete taskComplete = new TaskComplete() {
boolean firstDone = false;
boolean secondDone = false;
@Override
public void TaskDone(String asyncClassName) {
// TODO Auto-generated method stub
if(asyncClassName.equals("FIRST_ASYNC")) {
firstDone = true;
} else if(asyncClassName.equals("SECOND_ASYNC")) {
secondDone = true;
}
if(firstDone == true && secondDone == true) {
// Both async completed - do your work
}
}
};
步骤3:从异步类的onPostExecute方法中调用这些。
taskComplete.TaskDone("FIRST_ASYNC");
taskComplete.TaskDone("SECOND_ASYNC");
答案 4 :(得分:0)
你可以运行一个函数来改变一个标志(比如boolean
)从false
到true
并在运行第三个函数之前检查它们。
例如
bool task1Fineshed = false;
void setTask1Finished(){
task1Fineshed=true;
function();
}
bool task2Fineshed = false;
void setTask2Finished(){
task2Fineshed=true;
function();
}
void function(){
if(task1Fineshed && task2Finished){
//do something
}
}