2013-08-05 48 views
1

我有了返回一个布尔值的方法。该方法有一个异步调用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”必须是最终的,如果我让它最终我不能给它分配一个值。请建议一种方法来处理这种情况。

+2

除了语法错误之外,问题是在异步调用返回之前,布尔值将返回*。所以不知道你期望从这种方法... – assylias

回答

2

你也许可以看看的Future接口:

Future表示异步计算的结果。提供方法 以检查计算是否完成,等待其完成,并检索计算结果。 的结果只能在计算完成时使用get方法获取,如果需要,则在需要时进行阻塞,直到准备就绪。通过取消方法取消取消 。为 提供了其他方法,以确定任务是否正常完成或取消。一旦计算完成,计算就不能被取消。如果您 想用一个未来可取消性而但不 提供可用的结果,你可以声明类型的形式未来 和作为底层任务的结果返回null。

3

There'are很多模式来做到这一点。也许最简单的使用某种形式的回调函数,例如:

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 
      } 
     }); 
+0

这种方法onSucess()将被异步调用,我需要在主线程中的值。如果我创建一个全局/实例变量并为其分配布尔值。仍然主线程不知道该值何时分配以及何时应该读取全局值。你有没有想过你的答案? –

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(); 
+0

但是请注意,这将阻止等待'futureUserAnswer'被执行,所以你可以使用'syncExec'。 @ aim的答案在这里更有用。 –

+0

是的,这是事实。因此,您应该通过isDone()方法轮询Future,或者在单独的线程中进行轮询(当然不是ui线程)。它也可能是推荐使用重载的get(long timeout)方法。我也同意回调可能会更好。 –