如何访问任务的 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();
希望对您有所帮助。
我正在使用一个设计奇怪的库,这段代码基本上有一个带有 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();
希望对您有所帮助。