下面你会看到一些运行良好的代码--但只有一次。它被禁止在runOnUIThread完成之前阻塞。当它第一次被调用时,它就会这样做。但当第二次调用时,它会一直运行到最后,然后runOnUIThread开始运行。有可能是,在方法第一次运行后,调用它的线程仍然拥有锁,当它第二次调用该方法时,它会遍历。是这样的吗?我能做些什么来解决这个问题呢?或者这是一个计时问题,第二次调用者首先获得锁?
static Integer syn = 0;
@Override
public String getTanFromUser(long accid, String prompt) {
// make parameters final
final long accid_int = accid;
final String prompt_int = prompt;
Runnable tanDialog = new Runnable() {
public void run() {
synchronized(syn) {
tanInputData = getTANWithExecutionStop(TransferFormActivity.this);
syn.notify() ;
}
}
};
synchronized(syn) {
runOnUiThread(tanDialog);
try {syn.wait();}
catch (InterruptedException e) {}
}
return tanInputData;
}背景:调用此方法的线程是绑定服务中的异步任务,该服务在后台与银行进行事务处理。在不定期中断时,银行发送用户验证请求(captche、控制问题、pin请求等)并且服务必须通过对前台活动的弱引用回调来显示一些对话框。由于服务正在执行多个嵌套的while循环,因此同步显示对话框比停止并重新启动服务更容易(保存/恢复状态数据太复杂)。
发布于 2012-11-02 02:33:16
如果在FutureTask中使用Callable比在Runnable中使用更好,您可以尝试一下。据我所知,这种组合是为了提供线程的返回值。
public String getTanFromUser(long accid, String prompt) {
// make parameters final
final long accid_int = accid;
final String prompt_int = prompt;
Callable<String> tanDialog = new Callable<String>() {
public String call() throws Exception {
return getTANWithExecutionStop(TransferFormActivity.this);
}
};
FutureTask<String> task = new FutureTask<String>(tanDialog);
runOnUiThread(task);
String result = null;
try {
result = task.get();
}
catch (InterruptedException e) { /* whatever */ }
catch (ExecutionException e) { /* whatever */ }
return result;
}Callable类似于Runnable,但有一个返回值。
FutureTask执行同步并等待结果。类似于您的wait() / notify()。FutureTask还实现了Runnable,因此可以将其用于runOnUiThread。
https://stackoverflow.com/questions/13182397
复制相似问题