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