IntentService中的Thread.sleep会导致ANR

时间:2014-11-09 18:30:14

标签: intentservice android-anr-dialog

我有用于将数据上传到服务器的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部分。知道为什么会发生以及如何解决问题吗?谢谢。

1 个答案:

答案 0 :(得分:2)

我有同样的问题,在我的情况下,它是由IntentService的队列引起的。确保您没有多次调用此意向服务。似乎第一次调用IntentService失败并使用Thread.sleep()并且同时更多请求处于等待模式以使用此IntentService然后它抛出ANR。