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

Android异步任务等待其他任务完成,android,concurrency,android-asynctask,Android,Concurrency,Android Asynctask,我有两个asyc任务都执行单独的网络操作。我想要一个异步任务等待另一个任务完成一个变量..我想这样做就像在第一个变量的PostExecute上执行另一个asyc操作一样,但对于一个变量,我必须让另一个任务等待第一个任务完成…有什么可以有效实现的吗 如果需要同步调用另一个,则需要在第一个的OnpostExecute中创建另一个异步。引用时,不能使用.execute()so 首先,您必须像这样开始您的任务: // Start first task new Task1().executeOnExecu

我有两个asyc任务都执行单独的网络操作。我想要一个异步任务等待另一个任务完成一个变量..我想这样做就像在第一个变量的PostExecute上执行另一个asyc操作一样,但对于一个变量,我必须让另一个任务等待第一个任务完成…有什么可以有效实现的吗

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

引用时,不能使用.execute()so

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

// 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;
    }
}
私有类Task1扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
Log.d(“myApp”、“Task1已启动”);
对于(int x=0;x<10;++x)
{
尝试
{
睡眠(1000);
//Log.d(“myApp”,“睡眠1000毫秒”);
} 
捕捉(中断异常e)
{
e、 printStackTrace();
}
}
返回“”;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onPostExecute(字符串结果){
//让第二个任务知道第一个任务已经完成
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)");
    }
}
私有类Task2扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
Log.d(“myApp”、“Task2已启动”);
while(task1Finished==false)
{
尝试
{
Log.d(“myApp”,“等待任务1”);
睡眠(1000);
} 
捕捉(中断异常e)
{
e、 printStackTrace();
}
}
Log.d(“myApp”、“任务1完成”);
//你喜欢做什么
// ...
返回“”;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onPostExecute(字符串结果){
Log.d(“myApp”,“全部完成(任务2)”);
}
}

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

引用安卓开发者的话:“四个类有助于常见的专用同步习惯用法

  • 信号量是一个经典的并发工具

  • 倒计时锁存器是一种非常简单但非常常见的实用工具,用于在给定数量的信号、事件或条件保持之前进行阻塞

  • 循环载波是一种可重置的多路同步点,在某些类型的并行编程中很有用
  • 交换器允许两个线程在一个集合点交换对象,在几种管道设计中很有用。”
因此,我建议研究:

循环屏障

交换器

你的想法是正确的。你试过了吗?现在我的实现是那样的,但是…我不得不推迟一个单变量的大任务看看图片,我是这么想的