我实施了一个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" />
是否有人能够解释这种行为的原因? 如果你能告诉我一个解决方法,让我的应用程序在应用程序运行时继续发送请求,那就太好了。
答案 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/