我有一个必须返回布尔值的方法。该方法具有对run方法的异步调用。在run方法中,我必须在封闭方法中设置变量。下面是我的代码。
private boolean isTrue() {
boolean userAnswer;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
userAnswer = MessageDialog.openQuestion(new Shell(), "some message", "some question?");
}
});
return userAnswer;
}
这段代码给出了错误 - “userAnswer”必须是最终的,如果我把它作为最终,我不能为它分配一个值。请建议一种方法来处理这种情况。
答案 0 :(得分:5)
如果您需要将java.util.concurrent.FutureTask<V>
调整为Callable<V>
,则可以使用Runnable
。
public class UserQuestion implements Callable<Boolean> {
private String message;
private String question;
public UserQuestion(String message, String question) {
this.message = message;
this.question = question;
}
public Boolean call() throws Exception {
boolean userAnswer = MessageDialog.openQuestion(new Shell(),
message, question);
return Boolean.valueOf(userAnswer);
}
}
UserQuestion userQuestion = new UserQuestion("some message", "some question?");
FutureTask<Boolean> futureUserAnswer = new FutureTask<Boolean>(userQuestion);
Display.getDefault().asyncExec(futureUserAnswer);
Boolean userAnswer = futureUserAnswer.get();
答案 1 :(得分:4)
有很多模式可以实现这一目标。也许最容易使用某种回调函数,例如:
interface Callback {
void onSuccess(boolean value);
}
private boolean isTrue(final Callback callback) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
boolean userAnswer = MessageDialog.openQuestion(new Shell(), "some message", "some question?");
callback.onSuccess(userAnswer);
}
});
}
并调用这样的方法:
isTrue(new Callback() {
@Override
public void onSuccess(boolean value) {
// do some stuff
}
});
答案 2 :(得分:2)
您可以查看Future
界面:
Future表示异步计算的结果。方法 用于检查计算是否完成,等待它 完成,并检索计算结果。结果 只能在计算时使用方法get检索 完成,必要时阻止,直到准备就绪。取消是 由取消方法执行。提供了其他方法 确定任务是否正常完成或已取消。一旦 计算完成后,计算无法取消。如果你 我希望使用Future来取消可取性,但不是 提供可用的结果,您可以声明Future表单的类型 并且由于底层任务而返回null。