2013-06-20 78 views
17

我們如何處理方向更改,Activities/Fragments使用Volley停止/恢復?Android排球 - 方向更改

我知道,GET請求,響應將被緩存和第二次,我們試圖作出這樣的要求,我們將得到一個緩存的響應。(如果服務器發送正確的HTTP頭)

但什麼約POST?假設我做了一個POST請求(即註冊,我想只發生一次),我的應用程序進入後臺,請求完成,而應用程序仍然在後臺,然後我回到應用程序。如何獲得該RequestResponse,或者如何重新連接到該連接?

AFAIK有相當多的Volley這不支持。我對嗎?有沒有簡單的方法來解決上述情況,使用Volley

+5

「我該如何獲得該請求的響應,或者如何重新連接到該請求,如果仍然未決?」 - 僅僅因爲你的應用程序不再處於前臺不會阻止線程運行。是什麼讓你認爲'請求'還沒有傳送給你?使用保留的片段進行異步操作,這樣無論方向如何變化,異步操作都有一個穩定的基礎進行通信。 – CommonsWare

+0

由於某種原因,我產生了如果我們轉到背景(比如'Robospice'),'Volley'不會提供響應的印象,但是您是對的。我們必須調用'requestQueue.cancel(...)'來停止傳遞。我仍然想着一個簡單的方法來處理在「停止/恢復」期間正確地重新提供響應。 –

回答

8

凌空不提供了一個機制開箱即用,但你可以看看廣場的奧托庫爲Android,它是由處理情況像你優雅。

實施截擊請求偵聽器,張貼成功響應到總線上,裹在像「RegisterEventSuccess」事件對象(你定義了這個自己)。讓您的Activities或Fragments使用Otto的@Subscribe機制訂閱此事件類型。例如,如果一個Activity啓動Volley請求並因屏幕方向更改而死亡,則另一個Activity實例(也註冊到Otto總線)可以接收包含Volley請求響應的事件。

希望這是有用的。

+0

這個解決方案聽起來很有趣。有沒有一個地方你已經實現了這一點。你有沒有遇到過任何問題? – Rasmus

+1

不要重新打開一個死的問題,但我正在尋找一些Volley + Otto的請求/響應管理的例子,這傢伙放在一起非常乾淨的例子是兩個 https://github.com/tslamic/AndroidExamples/tree/master/HttpBinVolley – Selecsosi

+5

使用此解決方案時,如何處理在活動正在轉換的時刻(在第一個活動的onDestroy和新定向的onCreate之間)返回網絡響應的可能性?在這裏,這兩項活動都不會登記到公交車上等待事件。 @Producer方法可能解決這個問題,但它們看起來並不適合作爲通用網絡緩存,並且不能真正與原始模式保持一致。 –

4

我現在已經試圖解決@ kyle-ivey的問題,因爲在onPause()onResume()之間到達的響應被丟棄。這是一個真實的問題,因爲我在實時應用程序中體驗過它。

我的方法建立在由托馬斯MOERMAN答案實現事件總線模式,雖然我reimpemented從頭一個示例應用程序。這取決於Otto Event bus Library,GsonVolley。它在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一個完整的例子。

+0

我非常喜歡這個策略,感謝分享! –

0

有一個簡單的解決方案,解決了我使用Volley庫從網絡下載數據的問題。如果您的應用程序使用Google推薦的片段,那麼比您在加載數據時用戶旋轉屏幕時爲防止崩潰所做的所有操作都需要使用setRetainInstance(true);onCreateView片段(-s)的方法。

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View theView = inflater.inflate(R.layout.fragment_studios, container, false); 
    setRetainInstance(true); 
    lvStudios = (ListView) theView.findViewById(R.id.lvStudios); 
    return theView; 
}