0

.NET Web Api に投稿要求を行う Android アプリケーションがあります。正常に動作しますが、ユーザーにより良いサービスを提供するには、いくつかの更新が必要です。そして、これは私にとっていくつかの問題を引き起こします。

activity_main.xml ファイルにユーザー名、パスワードのテキスト ボックス、およびログイン ボタンがあります。

ユーザーがログインボタンをクリックすると、値がチェックされ、値が適切であれば、WebRequest.java クラスを介してサーバーに送信されます。

これが私の問題です:

これらの値をサーバーに送信すると、メイン (UI) スレッドがロックされます。スレッドを使用してそのロックを防止したかった:

public static WebLoginResponse loginRequest(final String username, final String password) {
    Thread loginThread = new Thread(new Runnable() {
        @Override
        public void run() {
            // making request here.
        }
    });
    loginThread.start();
}

これによりロックは防止されますが、応答は null を返します。その理由は明らかです。MainActivity.java ファイルからこのメソッドを呼び出すと、次のようになります。

WebLoginResponse response = WebRequests.loginRequest(username, password);

loginRequestを実行している loginThread が、UI スレッドが loginRequest メソッドから戻ってきて、応答変数の値を取得しようとしました。loginThreadはまだ仕事を終えていません。そのため、応答は null です。

応答は常に null であるため、これは私の問題の解決策ではありません。

最後に、このリクエストを実行したいのですが、UI スレッドをロックしたくありません。

どうすればそれを達成できますか?

ありがとう。

4

2 に答える 2

1

問題の解決策は、非同期プログラミングでよく知られているパターンであり、通常はpromisesfuturesまたはdelayと呼ばれます。

パターンの一般的な説明については、Wikipedia: Futures and promises を参照してください。

Java では、Futureインターフェースを見てください。これと一般的な Java 並行性に関する非常に優れたチュートリアルがLars Vogel のブログにあります。

于 2013-05-12T00:38:32.143 に答える