【问题标题】:Wait for an asynchronous task in asynctask in android在android中的asynctask中等待一个异步任务
【发布时间】:2015-12-23 10:49:17
【问题描述】:

我在 Android 中有一个 AsyncTask,它在不同的线程上运行异步任务(我不知道线程的生命,但我可以提供回调到任务)。有没有办法等待异步任务完成调用AsynctaskpostExecute函数?

谢谢,

【问题讨论】:

  • 请贴一些代码,不完全清楚是什么问题。
  • 我想,我们可以使用Thread.sleep(time)来达到这个目的。
  • @NigamPatro,睡眠无法预测,不会有太大帮助。
  • @saopayne 好的,我是这么想的。
  • 我暂时没有代码,只是想着解决这个问题。我只知道我必须等待异步完成(来自库)才能使用结果。

标签: java android multithreading asynchronous android-asynctask


【解决方案1】:

我认为您应该在这里定义一个Listener 接口,将实现该侦听器的对象的引用传递给您的AsyncTask,然后从您的onPostExecute 调用该对象的方法。

// this is your interface
// create it in its own file or as an inner class of your task
public interface OnTaskFinishListener {
    public void onTaskFinish();
}

// add the following code to your task's class
private OnTaskFinishListener mOnTaskFinishListener;
public void setOnTaskFinishListener(OnTaskFinishListener listener) {
    mOnTaskFinishListener = listener;
}

// in your onPostExecute method call this listener like this
// this will call the implemented method on the listener that you created
if (mOnTaskFinishListener != null) {
    mOnTaskFinishListener.onTaskFinish();
}

// suppose this is where you start your task
MyBackgroundTask task = new MyBackgroundTask();

// set new listener to your task - this listener will be called
// when onPostExecutes completed -> that's what you need
task.setOnTaskFinishListener(new OnTaskFinishListener() {
    @Override
    public void onTaskFinish() {
        // implement your code here
    }
});
task.execute(); // and start the task 

【讨论】:

    【解决方案2】:

    我宁愿不实施忙碌等待策略。两个AsyncTask 可以共享一个Semaphore,让一个停止而另一个完成

    初始化你的信号量

     private final Semaphore semaphore = new Semaphore(0);
    

    将该对象传递给两个任务

     public AsyncTask1(Semaphore semaphore){
         this.semaphore= semaphore;
     } 
    
     doInBackground(){
         //do something
         semaphore.acquire(); // <- Waiting till the other task finises
     }
    

    任务2

     public AsyncTask2(Semaphore semaphore){
         this.semaphore= semaphore;
     } 
    
     onPostExecute(){
       //do something
       semaphore.release();
    }
    

    【讨论】:

    • 找了很久,非常感谢。但是你觉得在 Android 环境中使用信号量有什么副作用吗?
    • 哦,天哪,这个答案来自很久以前。使用信号量,您可以使用一些低级指令来处理并发。从今天开始,我建议使用 Kotlin 协程或 RxJava 2 来完成这项任务
    • 但是你认为 RxJava2 是否适合这里的情况,我的意思是我们想要停止 doInBackground() 以等待其他 AsyncTask 完成。
    • 完全。使用 RxJava,您可以处理多个数据流。再次阅读问题,我认为我没有理解问题,但我想说zip 操作员解决了问题
    【解决方案3】:

    任务1

       private final Callback callback;
       public AsyncTask1(Callback callback){
           this.callback = callback;
       } 
       doInBackground(){
           //do something
           while(!callback.isFinished()){
               Thread.sleep(WAIT_TIME);
           }
       }
    

    任务2

       private final Callback callback;
       public AsyncTask2(Callback callback){
           this.callback = callback;
       } 
       onPostExecute(){
           //do something
           callback.setFinished(true);
       }
    
    class Callback{
        private volatile boolean finished = false;
        public void setFinished(boolean finished){
            this.finished = finished;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多