您好,登錄后才能下訂單哦!
我在實際項目中使用EventBus經驗總結:
剛開始聽到EventBus的時候,覺得好像比較高大上,沒有學過,不敢用。但是還是情不自禁的用到了項目當中。但是隨著EventBus使用的地方越多,問題就出現了,就像見了鬼一樣。
問題1
》描述:比如在Activity里有2個或多個Fragment,在兩個Fragment里都會在子線程中發布
MessageEvent在UI線程里吐司。但是問題來了,在FragmentA里我會請求網絡,然后我又到了
FragmentB中,竟然會接受到了FragmentA里的消息事件。
》原因分析:既然在Fragment里可以接受到FragmentA的消息,說明FragmentA沒有unRegist事件。
原因是我照搬網上的代碼,在onCreate里訂閱事件,在onDestroy里unRegist事件。
但實際上從FragmentA切換到FragmentB的時候,FragmentA是沒有走onDestroy方法的。
》解析方案:于是我決定在onStart與onStop方法里來走regist與unRegist方法。
雖然這個問題解決了,但是新的問題又來了。FragmentA里的吐司事件又接收不到了,
原因是FragmentA里的事件是在onActivityCreated方法里執行的,而這個生命周期的方
法又是在onStart之前執行的。所以當請求網絡回調發布事件的時候,還沒有訂閱事件。
于是乎,我做了一個雙重保險:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this); } @Override public void onStart() { super.onStart(); if(!EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().register(this); } } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.reset(this); if(EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().unregister(this); } }
問題2
搞開發就是這樣,問題問題層出不窮。
》描述:進入登錄Fragment,沒有點擊登錄按鈕就退出了。竟然還解析了登錄,并且登錄的吐司竟然彈在了主頁上。
》原因分析:最開始,打的bug竟然沒有走,后來又走了,才找到原因。事件定義重復了,主頁在
onResume里請求網絡會發布一個事件,因為事件的int類型與登錄Fragment里訂閱的登錄
解析事件的int型相重復。但是即使是這樣,登錄Fragment關閉了不可能接收到主頁的事
件啊。主要原因還是因為登錄Fragment的onDestroy方法有延遲,登錄Fragment雖然不
見了,但是觸發了主頁Fragment的onResume事件,登錄Fragment沒有來得及取消訂閱就
接受到了主頁Fragment的登錄解析事件,然后又把吐司給主頁Fragment了。
》解決方案:只要將沖突的事件int類型值改一下就行了。
綜上所述,EventBus訂閱與取消訂閱要及時準確(對所在類的生命周期把握準確),事件的定義(不同事件一定要有唯一標識),另外還有一點,事件類容易越寫越多,要注意重構抽取。
EventBus概論
EventBus是Google Guava庫里的一個類,用來進行消息傳遞,線程之間通訊。
2.EventBus的使用
首先必須要入庫
onCreate() 注冊EventBus EventBus.register(Object ),注冊的對象決定發布事件的參數
所在方法的反射范圍,一般用this,表示掃描當前類中所有的方法。
onDestroy() 注銷EventBus EventBus.unRegister(Object)
發布事件:EventBus.post(參數) 參數可以是任何類型,一般為實體類。
一般在子線程中發布獲得的數據,然后通過在主線程中的方法來接收參數,并更新UI。
注意:處理事件的方法一定要加上@Subscribe注解
3.EventBus的底層
EventBus的底層是用反射、集合Map技術。具體請看源碼。
資料拓展:http://blog.csdn.net/lmj623565791/article/details/40794879
http://m.blog.csdn.net/blog/u013173289/43970023
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。