0

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

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

mytask.wait();
return value; 

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

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

如果我尝试类似

while(!mytask.isComplete(){}

强制方法等待完成

应用程序完全冻结

我怎样才能正确获得任务完成时的价值?

4

2 回答 2

1

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

你很接近,但你错过了一些同步。要做wait()或者notify()你需要在一个synchronized街区。

如果您想编写一个返回某些值的任务,我会执行以下操作。将结果存储在一个字段中,在synchronized onComplete()oronFail()方法中更新该字段。然后,您的调用线程可以使用该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();

希望这可以帮助。

于 2018-05-19T16:12:39.223 回答
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();
    }
}
于 2018-05-18T17:38:32.277 回答