亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

EventBus-再也不用什么Handler了

發布時間:2020-07-20 23:49:01 來源:網絡 閱讀:3243 作者:屠夫章哥 欄目:移動開發

我在實際項目中使用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訂閱與取消訂閱要及時準確(對所在類的生命周期把握準確),事件的定義(不同事件一定要有唯一標識),另外還有一點,事件類容易越寫越多,要注意重構抽取。

 

     

  1. 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


[轉]EventBus使用詳解(二)——EventBus使用進階

http://m.blog.csdn.net/blog/u013173289/43970023




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潢川县| 肥东县| 枞阳县| 舞钢市| 延津县| 安丘市| 阆中市| 呼玛县| 呼和浩特市| 临漳县| 河源市| 娱乐| 丹寨县| 饶河县| 黄冈市| 绥棱县| 乡宁县| 亳州市| 福州市| 胶州市| 华安县| 太和县| 长宁区| 漠河县| 凤台县| 朔州市| 手机| 定边县| 巩留县| 台中县| 顺义区| 封丘县| 泊头市| 贡山| 教育| 新干县| 彝良县| 普定县| 延寿县| 阳信县| 斗六市|