Android异步任务等待其他任务完成

6

我有两个异步任务,分别执行不同的网络操作。我希望一个异步任务等待另一个任务完成特定变量的操作。我想通过在第一个异步任务的onPostExecute方法中执行另一个异步任务来实现这一目标,但是为了一个特定变量,我必须先让其他任务等待第一个任务完成。有什么高效的方法可以实现吗? enter image description here


1
你的想法是正确的。你试过了吗? - Sagar Maiyad
现在我的实现就是这样,但是我不得不因为一个变量而推迟了一个重要任务。 - paul
请看图片,我是这个意思。 - paul
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)");
    }
}

4
也许asynctask并不是最好的工具?在Android API中有一些有趣的类可以帮助完成特定的同步任务:
来自Android开发者的引用:“四个类可帮助实现常见的特殊同步惯用语。”
· Semaphore是一个经典的并发工具。
· CountDownLatch是一个非常简单但非常常见的实用程序,用于阻塞到给定数量的信号、事件或条件保持。
· CyclicBarrier是一种可重置的多路同步点,在某些并行编程风格中很有用。
· Exchanger允许两个线程在约会点交换对象,并且在几个管道设计中非常有用。
因此,建议查看:
· Cyclic Barrier http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html · Exchanger http://developer.android.com/reference/java/util/concurrent/Exchanger.html

0
如果您需要同步调用其他内容,则需要在第一个异步的OnPostExecute中创建另一个异步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接