Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中的asynctask中等待异步任务_Java_Android_Multithreading_Asynchronous_Android Asynctask - Fatal编程技术网

Java 在android中的asynctask中等待异步任务

Java 在android中的asynctask中等待异步任务,java,android,multithreading,asynchronous,android-asynctask,Java,Android,Multithreading,Asynchronous,Android Asynctask,我有一个Android中的AsyncTask,它在不同的线程上运行一个异步任务(我没有掌握线程的生命周期,但我可以回调该任务)。是否有方法等待异步任务完成以调用异步任务的后执行函数 谢谢,我认为您应该在这里定义一个侦听器接口,将实现该侦听器的对象的引用传递给您的异步任务,并从onPostExecute调用此对象的方法 // this is your interface // create it in its own file or as an inner class of your task p

我有一个Android中的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 
任务1

任务2


我宁愿不要实施忙碌等待策略。两个
AsyncTask
都可以共享一个
信号灯
,该信号灯使一个停止,而另一个完成

初始化你的信号灯

 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
 }

请发布一些代码,还不完全清楚问题出在哪里。我想,我们可以使用
线程。睡眠(时间)
来达到这个目的。@NigamPatro,睡眠在这方面是不可预测的,不会有多大帮助。@saopayne好的,我是这样想的。我现在没有任何代码,只是在思考这个问题的解决方案。我只知道我必须等待异步完成(从库中),才能使用结果。但是你觉得在Android环境中使用信号量有什么副作用吗?哦,天哪,这个答案很久以前就有了。对于信号量,您正在使用一些低级指令来处理并发性。从今天起,我建议使用Kotlin协同程序或RxJava 2来完成此任务,但您认为RxJava 2是否适合这里的情况,我的意思是我们要停止
doInBackground()
以等待其他异步任务完成。使用RxJava,您可以处理多个数据流。再读一遍这个问题,我想我不明白这个问题,但我想说操作员解决了这个问题
 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
 }
 public AsyncTask2(Semaphore semaphore){
     this.semaphore= semaphore;
 } 

 onPostExecute(){
   //do something
   semaphore.release();
}