如何访问任务的 void onComplete() 的结果

How to access result of void onComplete() of a Task

我正在使用一个设计奇怪的库,这段代码基本上有一个带有 onComplete()onfail() 方法的 Task 对象,这两种方法都是无效的,所以我不能使用 return 在里面。

我尝试使用在任务中更新的外部变量 onComplete()onfail() 使用

mytask.wait();
return value; 

本意是等待任务完成然后return值但是我得到

java.lang.IllegalMonitorStateException: object not locked by thread before wait()

如果我尝试

while(!mytask.isComplete(){}

强制方法等待完成

应用完全死机

如何正确获取任务完成时的值?

您可以创建一个 interface,将其传递给 AsyncTask(在构造函数中),然后在 onPostExecute()

中调用方法

例如:

您的界面:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

你的Activity:

public class YourActivity implements OnTaskCompleted{
    // your Activity
}

还有你的 AsyncTask:

public class YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    // required methods

    protected void onPostExecute(Object o){
        // your stuff
        listener.onTaskCompleted();
    }
}

java.lang.IllegalMonitorStateException: object not locked by thread before wait()

你很接近,但你缺少一些同步。要执行 wait()notify(),您需要在 synchronized 块中。

如果您想编写一个 return 具有一定价值的任务,我会执行如下操作。将结果存储在一个字段中,在 synchronized onComplete()onFail() 方法中更新该字段。然后你的调用线程可以在它完成后使用 waitForResult() 方法来 return 它。

public class MyTask implements Task {
    private String result;
    public synchronized void onComplete() {
        result = "it worked";
        // this is allowed because the method is synchronized
        notify();
    }
    public synchronized void onFail() {
        result = "it failed";
        // this is allowed because the method is synchronized
        notify();
    }
    public synchronized String waitForResult() {
        // a while loop is a good pattern because of spurious wakeups
        // also, it's important to realize that the job might have already
        // finished so we should always test it _before_ we wait
        while (result == null) {
            wait();
        }
        return result;
    }
}

正在测试一切以完成的线程然后只需要做:

String result = myTask.waitForResult();

希望对您有所帮助。