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

时间:2018-05-18 17:30:42

标签: java android multithreading android-task

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

我尝试使用

在任务onComplete()onfail()内更新的外部变量
mytask.wait();
return value; 

打算等待任务完成然后返回值,但我得到了

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

如果我尝试类似

的话
while(!mytask.isComplete(){}

强制方法等待完成

app完全冻结

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

2 个答案:

答案 0 :(得分:0)

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

例如:

您的界面:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

您的活动:

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();
    }
}

答案 1 :(得分:0)

  

java.lang.IllegalMonitorStateException:对象在wait()之前未被线程锁定

你很近但是你错过了一些同步。要执行wait()notify(),您需要进入synchronized区块。

如果你想编写一个返回某个值的任务,我会做类似以下的事情。在字段中输出结果,更新synchronized onComplete()onFail()方法中的字段。然后你的调用线程可以使用waitForResult()方法在完成后返回它。

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();

希望这有帮助。