在Android的AsyncTask中等待异步任务

3

我在Android中有一个AsyncTask,它在不同的线程上运行异步任务(我没有掌握线程的生命周期,但可以给任务提供回调)。是否有一种方法可以等待异步任务完成后再调用AsynctaskpostExecute函数?

谢谢。


请贴一些代码,现在问题还不太明确。 - Egor
我认为,我们可以使用 Thread.sleep(time) 来实现这个目的。 - Nigam Patro
@NigamPatro,这个程序中的睡眠时间是不可预测的,而且不会有太大帮助。 - saopayne
我现在还没有任何代码,只是在思考解决这个问题的方法。我只知道我需要等待异步完成(来自库),才能使用结果。 - user3660061
我认为没有办法等待两个都是“异步”的操作。前者可能会比后者先完成。 - Kyle Emmanuel
显示剩余2条评论
3个回答

2

我认为你在这里应该定义一个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环境中使用信号量会有任何副作用吗? - AbdelHady
哦,天啊,这个答案是很久以前的了。使用信号量时,您正在使用一些低级指令来处理并发。截至今天,我建议使用Kotlin协程或RxJava 2来完成此任务。 - Alberto S.
但是你认为RxJava2是否适合这种情况,即我们想要停止doInBackground()以等待其他AsyncTask完成。 - AbdelHady
当然。使用 RxJava 您可以处理几个数据流。我再次阅读问题,不确定我是否理解了问题,但我会说 zip 运算符可以解决这个问题。 - Alberto S.

0

任务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;
    }
}

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