5

ブール値を返す必要があるメソッドがあります。メソッドには、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」は最終でなければならず、最終にすると値を割り当てることができません。このシナリオを処理する方法を提案してください。

4

3 に答える 3

7

を に適応さ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();
于 2013-08-05T06:22:07.500 に答える
5

これを実現するには多くのパターンがあります。おそらく最も簡単なのは、ある種のコールバック関数を使用することです。たとえば、次のようになります。

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
            }
        });
于 2013-08-05T06:07:44.727 に答える