java/android事件總線的原理和簡單實現

前幾年同事推薦了eventbus和rxjava框架,當時粗略看了一下,使用場景還是挺少的,而且有一些替代方案,所以也就不怎麼關注,現在有時間重新瞭解一下,感覺還是挺難入門的,大部分文章裏面說的什麼註冊者、觀察者和一些流程圖,基本都是這兩個框架的實現細節,根本不涉及到核心原理,看到我雲裏霧裏的;其實看了一下eventbus的使用方法,大概能猜出是怎麼實現的,下面來總結一下;

這2個框架主要是用於Android中Activity、Service、Fragment之間的相互通信,其實就是不同線程之間的互相通信,常見的場景有:從一個列表頁面進去一個編輯頁錄數據,錄完保存成功後關閉編輯頁並且刷新列表頁,因爲蘆葦後要在列表頁上看到剛剛錄的那條數據,由於兩個activity是屬於不同線程,無法直接通過構造函數傳遞參數,官方實現方法有廣播和startActivityForResult,寫法和這2個框架差不了多少,好壞看個人喜好;像這種線程之間的通信,無非靠的是共享靜態變量來實現,下來貼下代碼:

核心類:

public class EventBus {

    public static Map<String,Object> mapBus=new HashMap<>();

    public static void setObject(Object object,String key){
        mapBus.put(key,object);
    }

    public static Object getObject(String key){
        return mapBus.get(key);
    }

    public static void removeObject(String key){
        mapBus.remove(key);
    }
}

列表頁(MainActivity):

 EventBus.setObject(this,"refresh");
同時創建刷新方法:
public void refresh(){
  ......
}

退出列表頁時需要從靜態變量中移除activity,不然activity會一直留着內存中:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.removeObject("refresh");
    }

編輯頁使用:

MainActivity activity = (MainActivity) EventBus.getObject("refresh");
activity.refresh();

這樣一來,不用官方的方法或者框架也能實現不同線程之間的互相操作了,如果只是這種場景的話,這些代碼就足夠了,如果使用場景複雜的話還是要進一步封裝的,一些優秀框架會充分考慮到複雜的場景,所以好的框架也是不錯的選擇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章