我有用于将数据上传到服务器的IntentService。当这个上传出错时(有时当用户没有接收或互联网连接时),我使用指数退避来尝试一次又一次地上传信息。我在onHandleIntent方法中执行此操作,根据我的理解,该方法在单独的线程中运行:
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
WebPostsRest posts = new WebPostsRest(HTTPVerb.POST, Uri.parse(CONSTS_WEB.URI_POST_NEW_POST), extras, this);
double backoffMillis = 0;
int backoffexp = 0;
int iTries = CONSTS_APP_GENERAL.NO_OF_POST_TRIES;
while (iTries > 0) {
mIsSuccess = posts.runRestNoReturnData();
if (mIsSuccess) {
iTries = 0;
} else {
if (backoffexp < 11) {
backoffMillis = Math.pow(2, backoffexp) * 1000;
backoffexp++;
}
try {
Thread.sleep((int) backoffMillis);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iTries--;
}
}
}
}
出于某种原因,我得到了ANR,我假设它来自这个Thread.sleep部分。知道为什么会发生以及如何解决问题吗?谢谢。
答案 0 :(得分:2)
我有同样的问题,在我的情况下,它是由IntentService的队列引起的。确保您没有多次调用此意向服务。似乎第一次调用IntentService失败并使用Thread.sleep()并且同时更多请求处于等待模式以使用此IntentService然后它抛出ANR。