保持调用线程直到多个asynctask结束

时间:2016-08-03 11:44:05

标签: android android-asynctask android-handler android-looper

我有一个后台线程,它调用3个asynctasks来同时执行任务。调用线程充当3组这些任务的队列。

所以基本上我需要同时调用3个asynctasks,一旦完成,我想调用队列中的下三个任务并重复。

然而,我无法暂停调用程序线程,直到三个asynctask结束。结果,队列中的后三个任务在前三个任务完成之前开始运行。

无论如何都要保持调用者线程直到asynctasks完成。我知道你可以在asynctask中使用.get()但它不会同时运行三个asynctasks。

2 个答案:

答案 0 :(得分:1)

以下代码是该想法的伪代码。基本上,您将声明一个接口,该接口将检查是否触发了下三个AsyncTasks。您还需要维护一个计数器,以查看AsyncTask收到的响应数是否乘以3.如果是,则可以触发下三个AsyncTasks。

public interface OnRunNextThree{
     void runNextThreeTasks();
}

public class MainClass extends Activity implements OnRunNextThree {

    private int asyncTasksCounter = 0;

    public void onCreate() {
        //Initiate and run first three of your DownloadFilesTask AsyncTasks

        // ...
    }

    public void runNextThreeTasks() {
        if (asyncTasksCounter % 3 == 0) {
            // you can execute next three of your DownloadFilesTask AsyncTasks now

            // ...
        } else {
            // Otherwise, since we have got response from one of our previously 
            // initiated AsyncTasks so let's update the counter value by one. 
            asyncTasksCounter++;
        }
    }

    private class DownloadFilesTask extends AsyncTask<Void, Void, Void> {

        private OnRunNextThree onRunNextThree;

        public DownloadFilesTask(OnRunNextThree onRunNextThree) {
            this.onRunNextThree = onRunNextThree;
        }


        protected Void doInBackground(Void... voids) {
            // Do whatever you need to do in background
            return null;
        }

        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //Got the result. Great! Now trigger the interface.
            this.onRunNextThree.runNextThreeTasks();
        }
    }

}

答案 1 :(得分:0)

异步任务意味着异步执行....所以这不能直接完成......

即使你设法做到这一点,它基本上也会失败异步操作的全部内容。

您应该寻找同步网络操作。

查看排球 ...这是专为网络运营而设的谷歌库,它支持同步操作

http://www.truiton.com/2015/02/android-volley-making-synchronous-request/

还有许多其他图书馆...... 改造是另一个好的图书馆..