2016-08-24 95 views
1

在調查我從用戶那裏獲得的報告之一時,我注意到當啓用省電模式(Nexus 4,Android 5.1.1)時,下載數據的後臺服務在一段時間後會出現連接異常。這發生在設備屏幕關閉時,沒有在屏幕上進行測試。省電模式下的網絡連接

有同時按住PowerManager.PARTIAL_WAKE_LOCKWifiManager.WIFI_MODE_FULL在行動中。我正在使用OkHttp進行連接,並且Wifi始終處於開啓狀態。

除了在這種情況下持有兩個鎖(wifi和partial_wake),我還能做什麼?這對於用戶使這些連接正常工作至關重要。

堆棧跟蹤 - 但它是不是真的與此有關,我認爲:

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和移動數據連接。我還證實,喚醒鎖正在被擱置,除了事實上沒有任何連接可能,所有事情都按照假設工作。屏幕開啓時,一切正常,但保持屏幕不是一個可接受的解決方案在這裏

回答

2

正如你所說 - 這可能是因爲省電模式。在這種模式下,系統會盡量減少喚醒呼叫的數量,並停止它認爲不必要的所有進程。

幸運的是,Android預見了一種解決這個問題的方法 - 它被稱爲Foreground Service。如果服務作爲前臺啓動,它將被視爲用戶活動,並且在資源不足時不會成爲要移除的主題。

您可以考慮遷移到前臺的所有關鍵活動,並把所有的支持模塊(例如,分析)的後臺服務

+0

感謝您的輸入。其實我忘了提到我的服務是前臺服務。我會看看它的前臺狀態是否正確處理。 – mhenryk

+0

我正在將您的答案標記爲正確答案 - 問題更爲詳細,但實際上Foreground Service是您必須在此使用的所有內容。問題在於我的服務在一段時間內停止了前臺(一兩秒鐘,而它做了其他工作),然後返回到前臺狀態。這足以讓Android終止我的應用的網絡訪問權限。 – mhenryk