【问题标题】:Android async task to wait for other task to completeAndroid异步任务等待其他任务完成
【发布时间】:2013-05-26 22:50:24
【问题描述】:

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

【问题讨论】:

  • 你的想法是正确的。你试过吗?
  • 现在我的实现只是这样,但是......我不得不推迟单个变量的大任务
  • 看看我的意思的图片

标签: android concurrency android-asynctask


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    参考this,不能这样使用.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)");
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      所以我建议调查一下:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多