1

Android は設計上、メイン スレッドでのネットワークを許可していませんが、強制することはできますが、良い習慣ではありません。したがって、ユーザー認証のためにデータベースから応答を取得できるように、メイン スレッドと他の 1 つのスレッドを同期させたいと考えています。同期が機能していません..

これはメインスレッドのコードです..

if (loginBTN.getId() == ((Button) v).getId()) {

    String emailId = loginField.getText().toString().trim();
    String password = passwordField.getText().toString().trim();

    postParameters.add(new BasicNameValuePair("username", emailId));
    postParameters.add(new BasicNameValuePair("password", password));

    try {

        System.out.println("b4 response" + responseToString);

        checkLogin();

        System.out.println("after response" + responseToString);

        synchronized (this) {

            while (isAvailable == false) {

                wait();

            }

            if (responseToString.equalsIgnoreCase("1")) {

                statusLBL.setText("Login Successful...");

            }

            else {

                statusLBL.setText("Sorry Incorrect Username or Password...");

            }
        }

    }

    catch (Exception e) {

        statusLBL.setText(e.toString());
    }

}




private void checkLogin() {

        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {

                try {

                    HttpClient http = new DefaultHttpClient();
                    HttpPost request = new HttpPost("http://example.org/api/android_gradhub/login_user.php");
                    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
                    request.setEntity(formEntity);
                    HttpResponse response = http.execute(request);
                    HttpEntity entity = response.getEntity();

                    // responseToString = EntityUtils.toString(entity);

                    synchronized (this) {

                        while (isAvailable == true) {

                            wait();

                        }

                        responseToString = EntityUtils.toString(entity);
                        notifyAll();
                    }

                    System.out.println("response " + responseToString);
                }

                catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });

        thread.start();

    }
4

1 に答える 1

0

同期化をすべて削除してからthread.join()、 の最後のステートメントとして配置しcheckLoginます。これは、スレッドが完了するのを待ってから続行する最も簡単な方法です。

いつ待機するかを決定したい場合 (ログインのチェックが必要になる前に、メイン プログラムで他の処理を実行したい場合など)、からスレッドを返すcheckLoginことができます。joinメインプログラムにいつ戻るかを決めるよりも。(つまり、シグネチャが に変更されpublic Thread checkLogin、checkLogin の最後の行が になりreturn threadます。メイン プログラムに戻りThread thread = checkLogin();、checkLogin が完了するのを待ちたいときに呼び出します。thread.join()その時点までは、メイン スレッドと checkLogin スレッドが並行しています)。

于 2013-05-26T01:00:57.343 に答える