当应用程序睡着时,Volley TimeoutError

时间:2017-04-21 20:18:36

标签: android android-volley android-internet

我实施了一个Volley Request间隔来定期发出请求:

    final Handler handler = new Handler();

    final int interval = 3000;

    handler.postDelayed(new Runnable() {
        public void run() {

            // Volley request here...
            Volleyclient client = Volleyclient.getInstance();
            client.doSomeVolleyRequest(MainActivity.this, someListener, someDataToSend);

            handler.postDelayed(this, interval);
        }
    }, interval);

只要应用程序位于前台,它就可以正常工作。如果我按下主页按钮,应用程序睡着了,我得到了一个Volley TimeoutError,我无法找出原因。如果我切换到“待机”模式(屏幕关闭),则行为相同。一旦我将我的应用程序切换回前台,它就会继续进行截击请求。

我怀疑这不是真正的超时,而是在入睡时的互联网连接权限问题。我使用以下内容:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

是否有人能够解释这种行为的原因? 如果你能告诉我一个解决方法,让我的应用程序在应用程序运行时继续发送请求,那就太好了。

2 个答案:

答案 0 :(得分:2)

我认为问题出在您的主题上。 post延迟在UI线程中进入队列的操作。当手机进入睡眠状态时,没有用于工作的UI线程。我假设改变线程将解决这个问题。如果不行,请告诉我。

修改:您在活动中说明了您的代码。但是当手机锁定(或黑屏)时,所有活动都会暂停状态。如果想在手机睡觉时继续工作,则必须使用服务。服务没有像活动那样的生命周期。它们将连接到手机并继续工作(即使你的应用程序已经被杀死),直到你让它们停止或用户中断。

有一个例子可以很好地解释:How to execute background task when Android app is closed / set to background?

答案 1 :(得分:1)

经过长时间的研究,我现在能够回答我自己的问题。 我讨厌它,但没有其他人能够弄明白。

描述行为的简单原因是:打盹模式!

这不是一个线程问题,它只是由于进入打盹模式而导致的禁用网络访问。打盹模式的一个特征是:网络访问被暂停。

https://developer.android.com/training/monitoring-device-state/doze-standby.html

https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/