我正在使用一个奇怪的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完全冻结
如何在完成任务时正确获取值?
答案 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();
希望这有帮助。