在调查我从用户那里得到的报告时,我注意到当启用省电模式(Nexus 4,Android 5.1.1)时,下载数据的后台服务会在一段时间后获得连接异常。当设备屏幕关闭时,会发生这种情况,没有在屏幕上进行测试。
操作期间同时存在 PowerManager.PARTIAL_WAKE_LOCK 和 WifiManager.WIFI_MODE_FULL 。我使用OkHttp进行连接,Wifi一直打开。
除了在这种情况下同时持有两个锁(wifi和partial_wake),我还能做什么?这对于用户使这些连接有效至关重要。
Stacktrace - 但是我认为它并不是真的相关:
W/System.err: java.util.concurrent.ExecutionException: java.net.ConnectException: Failed to connect to *************
W/System.err: at java.util.concurrent.FutureTask.report(FutureTask.java:93)
W/System.err: at java.util.concurrent.FutureTask.get(FutureTask.java:177)
....
W/System.err: Caused by: java.net.ConnectException: Failed to connect to **************
W/System.err: at okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:139)
W/System.err: at okhttp3.internal.io.RealConnection.connect(RealConnection.java:108)
W/System.err: at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188)
W/System.err: at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127)
W/System.err: at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
W/System.err: at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:289)
W/System.err: at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
W/System.err: at okhttp3.RealCall.getResponse(RealCall.java:240)
W/System.err: at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
W/System.err: at okhttp3.RealCall.execute(RealCall.java:57)
...
编辑:这种情况发生在wifi和移动数据连接上。我还确认唤醒锁被占用并且一切正常,除了无法连接的事实。当屏幕打开时,一切正常,但保持屏幕打开是不可接受的解决方案
答案 0 :(得分:2)
正如您所提到的 - 这可能是因为省电模式。在此模式下,系统会尝试最小化唤醒呼叫的数量,并停止它认为不必要的所有进程。
幸运的是,Android预见到了解决这个问题的方法 - 它被称为前台服务。如果服务作为前景启动,它将被视为用户活动,并且在资源不足时不会被删除。
您可以考虑将所有关键活动移至Foreground,并将所有支持模块(例如,分析)留在后台服务中