我有一个从服务器发送和接收数据的应用程序。这些请求中的每一个都是通过创建一个新线程来发出的,以防止锁定 UI。在我的设备上和测试中,我没有收到任何 ANR,但似乎其他用户会不时遇到它们。
在一个示例中,在 Play 商店中查看我的 ANR 报告表明我从我的登录功能收到了一些 ANR。
当用户输入他们的凭据并按下登录按钮时,onCreate 会调用 login() 函数来检索有关用户的其他信息。该代码包含以下内容:
new Thread(new Runnable() {
public void run() {
UserClient userClient = application.getUserClient();
final Map<String, Object> user = userClient.getUser();
runOnUiThread(new Runnable() {
public void run() {
Login.this.hideLoadingThrobber();
if (user != null) {
startActivity(new Intent(Login.this, AccountOverview.class));
finish();
} else {
showLoginFailed();
}
}
});
}
}).start();
userClient.getUser() 看起来像这样:
public Map<String, Object> getUser() {
RestClient client = getRestClient();
String result = client.queryRESTurl("/user/");
if (result != null && !result.equals("login failed")) {
return JsonParser.toMap(result);
} else {
return null;
}
}
据我所知,这是为了防止任何类型的 ANR 而正确设置的,但对于某些用户,它仍然会不时弹出。
有什么看起来不寻常或我做错了吗?我应该以不同的方式处理我的线程吗?