サーバーからデータを送受信するアプリがあります。これらの各要求は、UI のロックを防ぐために新しいスレッドを作成することによって行われます。私のデバイスとテストでは、ANR を取得していませんが、他のユーザーが時々 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 を防止するように適切に設定されていますが、一部のユーザーにはまだ時々ポップアップします。
異常に見えることや、私が間違っていることはありますか? スレッドを別の方法で処理する必要がありますか?