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();
}
答案 0 :(得分:0)
删除所有同步,然后将thread.join()
作为checkLogin
中的最后一个语句。 这是在继续之前等待线程完成的最简单方法。
如果您想决定何时等待(就像您可能希望在登录之前需要在主程序中执行其他操作),那么您可以从{{1}返回 }。比你决定何时回到主程序checkLogin
。 (即签名更改为join
,checkLogin的最后一行变为public Thread checkLogin
。返回主程序时,如果要等待checkLogin完成,请调用return thread
- 使用{{1}直到那时为止,主线程和checkLogin线程并发)。