0

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

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

但是,在三个异步任务完成之前,我无法暂停调用者线程。结果,队列中的下三个任务在前三个任务完成之前开始运行。

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

4

2 回答 2

1

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

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();
        }
    }

}
于 2016-08-03T13:45:15.440 回答
0

异步任务旨在异步执行操作....所以这不能以直接的方式完成...

即使您设法做到这一点,它也基本上破坏了异步操作的全部意义。

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

查看Volley ... 这是一个专门为网络操作而制作的 google 库,它支持同步操作

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

还有许多其他可用的库... Retrofit是另一个不错的库..

于 2016-08-03T11:54:58.667 回答