我現在已經試圖解決@ kyle-ivey的問題,因爲在onPause()
和onResume()
之間到達的響應被丟棄。這是一個真實的問題,因爲我在實時應用程序中體驗過它。
我的方法建立在由托馬斯MOERMAN答案實現事件總線模式,雖然我reimpemented從頭一個示例應用程序。這取決於Otto Event bus Library,Gson和Volley。它在IntelliJ 13 Ultimate中使用Maven tom解決依賴關係。
解決方案:我在前面的答案中添加了一個類,它充當HTTP響應緩衝區,負責在活動過渡時監聽事件。完成後,活動會主動輪詢在活動與事件總線斷開連接時可能已經到達的任何響應。它掛鉤開/關在和onResume
-events以一種方式的情況下,總線登記這樣旁邊:
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
這裏是the ResponseBuffer-class實現。
買者1:如果活動是永遠不會恢復,而且既不stopAndProcess()
也不stopAndPurge()
被稱爲在任何進一步的活動,該緩衝液可以是內存泄漏的來源。注意你如何使用它。一個安全的模式將是stopAndProcess()
在onResume()
所有您的activites。
警告2:它不是線程安全的。如果在星形保存的位置和註銷事件總線之間的線路上出現上下文切換,則可能會收到事件兩次或零次。
的例子包括UI和支持類的形式,一些測試代碼,但如果你想利用在一個單獨的項目,這個模式就需要主類在以下包的那些:
- nilzor.ottovolley.core
- nilzor.ottovolley.messages
見GitHub的版本庫OttoVolleyDoneRight與測試UI一個完整的例子。
「我該如何獲得該請求的響應,或者如何重新連接到該請求,如果仍然未決?」 - 僅僅因爲你的應用程序不再處於前臺不會阻止線程運行。是什麼讓你認爲'請求'還沒有傳送給你?使用保留的片段進行異步操作,這樣無論方向如何變化,異步操作都有一個穩定的基礎進行通信。 – CommonsWare
由於某種原因,我產生了如果我們轉到背景(比如'Robospice'),'Volley'不會提供響應的印象,但是您是對的。我們必須調用'requestQueue.cancel(...)'來停止傳遞。我仍然想着一個簡單的方法來處理在「停止/恢復」期間正確地重新提供響應。 –