Java android主线程与另一个线程同步

Java android主线程与另一个线程同步,java,android,Java,Android,Android在设计上不允许在主线程上使用网络,可以强制使用,但这不是一个好的做法。所以我想同步主线程和另一个线程,这样我就可以从数据库中获得用户身份验证的响应。我的同步无法工作 这是主线程中的代码 if (loginBTN.getId() == ((Button) v).getId()) { String emailId = loginField.getText().toString().trim(); String password = passwordField.getT

Android在设计上不允许在主线程上使用网络,可以强制使用,但这不是一个好的做法。所以我想同步主线程和另一个线程,这样我就可以从数据库中获得用户身份验证的响应。我的同步无法工作

这是主线程中的代码

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

    }

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


如果您想决定何时等待(就像您可能想在检查登录之前在主程序中执行其他操作),那么您可以
checkLogin
返回线程。然后决定何时加入主程序。(即,签名更改为
公共线程checkLogin
,最后一行checkLogin变为
返回线程
。回到主程序中,当您想等待checkLogin完成时,调用
线程=checkLogin();
-使用
线程.join()
,直到主线程和checkLogin线程是并发的。)

你的问题是什么?同步不起作用。这起作用了,但可以帮助我修复同步。我正在学习多线程,这将是一个很大的帮助。在你的示例中,为什么需要同步。什么是有争议的资源?一个更现实的共享资源问题示例会有所帮助。responseToString是有争议的resourceOk。现在,
responseToString
isAvailable
之间的关系还不清楚。是否有设置
isAvailable
的代码?是的,如果有响应,我将其存储在responseToString中,isAvailable为true。。否则它是假的