【问题标题】:Volley TimeoutError when app asleep应用程序睡眠时的 Volley TimeoutError
【发布时间】:2017-04-21 20:18:36
【问题描述】:

我实现了 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" />

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

【问题讨论】:

    标签: android android-volley android-internet


    【解决方案1】:

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

    编辑:您在活动中说出了您的代码。但是当手机锁定(或黑屏)时,所有活动都会进入暂停状态。如果想在手机休眠时继续工作,您必须使用服务。服务没有像活动这样的生命周期。它们将连接到手机并继续工作(即使您的应用程序已被终止),直到您让它们停止或用户中断。

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

    【讨论】:

    • 好的,这是有道理的。代码目前直接放在我的MainActivity的onCreate-Method中。您能否通过发布链接或一些示例代码向我指出一个简单的解决方案,将其放入另一个线程?
    • 我现在将所有内容都迁移到了服务中。在真实设备上几乎相同的行为。如果我通过 USB(调试)连接,如果应用程序不在前台,它会继续发送。如果我断开 USB,它会在不在前台时给我一个 Volley TimeoutError。在所有情况下,在睡眠模式下发送都失败(显示关闭)。如果我将应用程序放回前台,一切正常。非常奇怪和讨厌。
    • 似乎服务本身在后台运行良好。在所有情况下在后台运行时都会定期显示 Error-Toast,因此线程似乎在运行。只是凌空通讯失败。
    • 好的,我明白了:原因是打盹模式。谢谢你的建议。但线程不是问题。
    • 太棒了!很高兴听到这个消息!您能否通过添加如何解决来更新您的问题。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2015-06-07
      • 2015-02-12
      相关资源
      最近更新 更多