在android的主线程和另一个线程之间同步

时间:2013-05-26 00:53:59

标签: java android

Android by design不允许主线程上的网络可以被强制但它不是一个好习惯。所以我想同步主线程和另一个线程,以便我可以从数据库获取响应以进行用户身份验证。我的同步不起作用..

这是主线程中的代码..

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

    }

1 个答案:

答案 0 :(得分:0)

删除所有同步,然后将thread.join()作为checkLogin中的最后一个语句。 这是在继续之前等待线程完成的最简单方法。

如果您想决定何时等待(就像您可能希望在登录之前需要在主程序中执行其他操作),那么您可以从{{1}返回 }。比你决定何时回到主程序checkLogin。 (即签名更改为join,checkLogin的最后一行变为public Thread checkLogin。返回主程序时,如果要等待checkLogin完成,请调用return thread - 使用{{1}直到那时为止,主线程和checkLogin线程并发)。