6

我有两个异步任务都执行单独的网络操作。我希望一个异步任务等待其他任务完成单个变量..我想这样做就像在第一个的Postexecute上执行其他异步操作但是对于我有一个变量让其他任务等待第一个完成......有什么可以有效地实现 在此处输入图像描述

4

3 回答 3

5

参考这个,你不能这样使用 .execute() ;

首先,您必须像这样开始您的任务:

// Start first task
new Task1().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");
// Start second task
new Task2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");

然后您可以创建一个静态变量,以便两个任务都可以访问它:

public static boolean task1Finished = false;

然后是任务的简单示例:

第一项任务

private class Task1 extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        Log.d("myApp", "Task1 started");

        for(int x = 0; x < 10; ++x)
        {
            try 
            {
                Thread.sleep(1000);
                //Log.d("myApp", "sleeped 1000 ms");
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
        return "";
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String result) {
        // Lets the second task to know that first has finished
        task1Finished = true;
    }
}

第二个任务

private class Task2 extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        Log.d("myApp", "Task2 started");
        while( task1Finished == false )
        {
            try 
            {
                Log.d("myApp", "Waiting for Task1");
                Thread.sleep(1000);
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }

        Log.d("myApp", "Task1 finished");
        // Do what ever you like
        // ...
        return "";
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("myApp", "All done here (Task2)");
    }
}
于 2013-05-31T08:05:20.420 回答
4

也许 asynctask 不是最好的工具?android api 中有一些有趣的类可以帮助专门完成同步工作:

引用自 android developer :“四个类帮助常见的专用同步习惯用法。

  • Semaphore 是一个经典的并发工具。

  • CountDownLatch 是一个非常简单但非常常用的实用程序,用于阻塞直到给定数量的信号、事件或条件成立。

  • CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。
  • Exchanger 允许两个线程在一个集合点交换对象,并且在多个管道设计中很有用。”

所以我建议调查:

循环障碍 http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html

交换 器 http://developer.android.com/reference/java/util/concurrent/Exchanger.html

于 2013-05-31T08:16:58.627 回答
0

如果您需要同步调用另一个,则需要在第一个的 OnpostExecute 中创建另一个异步。

于 2013-05-31T07:41:31.973 回答