1

我想在 Android 上实现如下内容:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    //Code to wait for myAsyncTask to finish


}

问题是如何在开始新迭代之前等待 myAsyncTask 完成。我认为一种可能的解决方案是在里面放置一个处理程序等待几秒钟。例如:

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 

    } 
}, 5000); 

但是即使它正在工作,这也是不对的,因为您必须设置一个标准时间来等待 myAsyncTask。并且不确定 myAsyncTask 是提前完成还是延迟完成,因为 a,b.. 参数在每次迭代中都会发生变化。

我认为的另一个解决方案是每次循环询问对象 aTask 以获取 myAsyncTask 的状态并检查它是否已完成。例如:

while(!aTask.getStatus().equalsTo(AsyncTask.Status.FINISHED)){

}

但这不起作用,因为 myAsyncTask 始终在运行。

有人可以帮助我吗?

4

4 回答 4

1
 //Code to wait for myAsyncTask to finish

如果你在那里等待,你会冻结 UI。如果您打算等待,那么另一个线程有什么意义?

我猜你需要的是使用execute(Params...)方法中的可选参数。你可以放你的'a','b'或者这些物体是什么,放多少并不重要。这将使您的任务能够执行所有这些并具有更好的控制力。

protected Long doInBackground(Objects... objs){
    for(int i = 1; i < objs.length; i++){
       // Do Work
    }
}
于 2013-09-12T17:54:12.677 回答
0

在 Android 中,您不能停留在 UI 线程中等待某事。这包括等待在后台运行的 AsyncTask。如果您在调用线程中等待,它将阻止用户并冻结您的设备。

您必须将代码分成两部分。

首先启动AsyncTasks:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    // dont wait here. It would freeze the UI Thread
}

Task 完成后的第二次运行代码只是覆盖onPostExecute().MyAsyncTask

然后 Android 可以在 AsyncTasks 运行时完成它的工作。

于 2013-09-12T17:50:59.820 回答
0

一个简单的建议,取决于你的 for 循环实际上在做什么,是使用循环来创建一个你想要处理的项目的“队列”。然后,使用队列中的第一个对象启动异步任务,并在完成该任务后,启动队列中的下一个对象,直到队列的长度为零

于 2013-09-12T17:51:31.883 回答
0

easiest方法是从您调用的地方创建一个方法,然后asynTask.execute()onPostExecute().

public class ParentClass extends Activity
{

   int asyncCalls = 0;
   ......


    public void callAsyncTaskAgain()
    {
      aTask = new myAsyncTask(a,b..);
      aTask.execute();

      asyncCalls++;
    }


    public class AnotherClass extends AsyncTask
    {

         protected Void onPostExecute(Void result)
         {
            ....

            if(asyncCalls < SOME_NUMBER)
                  callAsyncTaskAgain();
    }
}

}

希望这可以帮助

于 2013-09-12T18:22:13.800 回答