2013-09-25 26 views
10

我正在尋找技術答案,以瞭解android robospice庫如何管理活動生命週期。從入門頁面:robospice如何管理活動生命週期?

https://github.com/octo-online/robospice/wiki/Starter-Guide

「作爲一個內部類的活動(或其他方面),加一個RequestlListener將更新你的UI不用擔心內存泄漏,RoboSpice管理您的活動的生命週期。」

我的問題是,robospice如何自動更新請求偵聽器,以便在旋轉之後和活動被銷燬並重新創建爲新實例之後,仍然能夠使用正確的上下文調用正確的偵聽器?

我一直在試圖反向工程的源代碼,但沒有找到答案尚未:

https://github.com/octo-online/robospice

回答

9

@Take Chances Make Cha。你所說的完全正確。 RS的設計需要考慮到這一點:管理網絡請求和活動的生命週期。

@ craigrs84。基本上,RS會發生什麼情況,當處理請求時,只要關聯的活動處於活動狀態,就會調用它的監聽器。如果該活動不再活躍,則其所有聽衆都將從RS中拔出,並且不會通知他們。

RS的主要目的是確保沒有內存泄漏:如果活動死了,它將會死亡並被垃圾收集,RS不會持有任何硬引用來防止垃圾採集。這真是RoboSpice背後的核心理念。

如果您希望將您的活動的新實例重新插入未決請求(例如,您執行請求,然後旋轉設備,然後獲取您的活動的新實例,並希望該新實例接收由前一個實例執行的請求的結果),這可能與RS。

在這種情況下,在調用spiceManager.start(..)後立即使用方法spiceManager.addListenerIfPending。這不會執行新的請求,而是將新偵聽器重新插入到待處理的請求中。如果沒有請求正在等待,那麼它將不會執行任何操作。

+0

所以如果你沒有提供requestCacheKey,並且同時有多個同一個Activity運行的實例,那麼addListenerIfPending仍然能夠正常工作嗎?或者在這種情況下沒有足夠的信息?這可能不太可能,但我很好奇。 – craigrs84

+0

@snicolas,我很好奇,如果你沒有調用shouldStop()(或非異步方法)庫不會回調那些註冊到Activities,Fragments,Services等的監聽器?如果不通過源代碼挖掘太多,並且基於我的早期使用和庫的測試,我會收到一個異常,當我收到一個對象已經「死亡」的回調。此外,圖書館是偉大的,請保持良好的工作! – AllDayAmazing

+0

如果你不調用shouldStop,那麼監聽器將被觸發。這可能會導致崩潰和內存泄漏,因爲經常監聽器是內部類,並且對活動實例持有引用,這些引用已被銷燬,並且如果您在偵聽器中執行findViewById等操作,它甚至會崩潰。我想你明白了,只是想澄清事情。 – Snicolas

2

簡短的回答,從我的經驗是,事實並非如此。

例如,如果您沒有調用SpiceManager.shouldStop()並執行請求,則對RequestListener的引用仍然保留,並且如果您的Activity /片段/服務不再存在。

+0

對不起,但沒有,在聽衆沒有內存泄漏RS。他們被刪除,垃圾收集在shouldStop。 – Snicolas