2016-04-29 42 views
2

我正在學習Android,而AFAIK是在活動之間傳遞數據的標準Android機制,它使用Intents,而後者在較低級別上實現爲IPC(也許我錯了)。事件總線庫機制與使用靜態變量在活動之間傳遞數據一樣糟嗎?

似乎最近出現了一堆庫,讓Android開發人員的生活更輕鬆。在他們之間,着名的Event Bus(Greenrobot的一個,Square的Otto)。我一直在嘗試這兩種(幾乎精確的接口語義),並且已經看到了一些關於如何使用Greenrobot事件總線將事件發佈到使用.postSticky的事件的文章,它允許消費或拉動新活動上的事件,當這是準備好獲取這些數據。但是從我現在的理解來看,使用Intents(以及因此在處理複雜對象時使用可序列化/可parcelable對象的繁瑣工作)的主要目的是允許Android在系統殺死應用程序後重新創建這些數據由於資源限制,通常當你切換到另一個應用程序,並開始玩耍。所以在這種情況下,當你切換回你的應用程序時,你會得到NULL指針對使用​​事件總線傳遞的數據。

我錯過了什麼嗎?或者乾脆採用這種方法(事件總線將數據傳遞給活動),即使代碼非常乾淨,是完全錯誤的?

+0

+對於我可以測試的內容,看看將結果傳遞給活動而不是使用startActivityForResult是一種合理的方法。 –

回答

2

使用意圖(因此使用當你處理複雜的對象序列化/ parcelable對象的繁瑣的工作)是允許的Android到系統殺死該應用後重新創建該數據由於資源約束的主要目的,通常當你切換到另一個應用程序,並開始玩

這是Android的功能。我不會將其描述爲「使用Intents的主要目的」。使用Intents的主要目的是能夠調用功能(例如,啓動一個活動),而不用考慮該功能是否在當前進程中執行,您的某個單獨進程,在其他正在運行的應用進程中,還是在某個進程尚不存在(因爲此時應用程序未運行)。

因此,在這種情況下,當您切換回應用程序時,您會在使用事件總線傳遞的數據上獲得NULL指針。

不,您只是在註冊偵聽器時沒有收到事件。只要你的代碼可以處理這種情況,這裏沒有問題。

或者簡單地說這種方法(事件總線將數據傳遞給活動),即使代碼非常乾淨,是完全錯誤的嗎?

我不會推薦這種方法。這就是說,恕我直言,它也不是「完全錯誤」。 「完全錯誤」表示使用該技術無法創建功能正常的Android應用程序。 Android應用程序具有廣泛的用例,所以有些人甚至可以孤立地使用這種技術。而且,在某些情況下,將此技術與其他內容(例如數據持久性)結合使用可能會非常好。

postSticky()只是一個綁定到事件總線中的內存中高速緩存。緩存是許多Android應用程序的重要組成部分,以儘量減少重複的磁盤或網絡I/O。只要postSticky()僅用作內存中緩存,應用程序不應該陷入困境。依賴於postSticky()倖存進程終止的應用程序有有問題,但這不是postSticky()所特有的,而是內存緩存的一個普遍問題。依靠任何內存緩存倖存的進程終止的應用程序有問題。

+0

>只要你的代碼可以處理這種情況,這裏沒有問題。 你能澄清一點嗎?我想要做的是將複雜對象(ViewModel)的'List '傳遞給在源活動中使用'bus.postSticky(viewModels)'的活動,並將該'List'傳遞給目標活動簡單的乾淨的代碼,並避免「意圖」,因此序列化。但是當系統「進程被殺死」時,當然不會陷入空指針的陷阱。所以當重新創建dest活動時,我可以重新列表。這可能使用事件總線嗎? –

+1

@GerardB:你無法避免使用'intents',因爲你根本沒有任何活動,更不用說通過事件總線進行通信了。正如我寫的,'postSticky()'是一個緩存。如果緩存存在,請使用緩存,但如果緩存爲空,請準備重建對象。在'Intent'中傳遞足夠的信息以便能夠從持久存儲中的當前數據重建'List ',以防緩存的值不可用。所有'startActivity()'調用都涉及IPC;不要''''通過'Intent'extras。 – CommonsWare

+0

對不起,我的意思不是「避免意圖」,我的意思是,避免意圖的額外事情(把'列表'內部)。當然,我需要一個意圖來'startActivity()'。我會考慮你的提示,並嘗試使用粘滯緩存(如果可用的話)(大部分時間將在我的情況下),並嘗試在dest Activity中構建我的'List ',如果緩存不可用,則將一些數據傳遞給Intent extra。當由於進程死亡而重新創建活動時)。謝謝! –