這個 RxBus 穩如老狗

logo

rb
License

Download

Gradle:java

implementation "com.blankj:rxbus:1.1"
複製代碼

How to use

非粘性事件

  1. 註冊事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 註冊 String 類型事件
        RxBus.getDefault().subscribe(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 註冊帶 tag 爲 "my tag" 的 String 類型事件
        RxBus.getDefault().subscribe(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 註銷
        RxBus.getDefault().unregister(this);
    }
}
複製代碼
  1. 發送事件
// 發送 String 類型事件
RxBus.getDefault().post("without tag");

// 發送帶 tag 爲 "my tag" 的 String 類型事件
RxBus.getDefault().post("with tag", "my tag");
複製代碼

粘性事件(也就是先發送事件,在以後註冊的時候便會收到以前發送的事件)

  1. 發送事件
// 發送 String 類型的粘性事件
RxBus.getDefault().postSticky("without tag");

// 發送帶 tag 爲 "my tag" 的 String 類型的粘性事件
RxBus.getDefault().postSticky("with tag", "my tag");
複製代碼
  1. 註冊事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 註冊 String 類型事件
        RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 註冊帶 tag 爲 "my tag" 的 String 類型事件
        RxBus.getDefault().subscribeSticky(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 註銷
        RxBus.getDefault().unregister(this);
    }
}
複製代碼

Nice wrap

若是用到事件總線的地方比較多,那麼能夠把事件總線的使用放到一個 Manager 中使用,好比我 Demo 中作的封裝以下所示:git

public class RxBusManager {

    private static final String MY_TAG = "MY_TAG";

    public static void subscribeRxBusManagerActivity(final RxBusManagerActivity activity){
        RxBus.getDefault().subscribe(activity, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("without " + s);
            }
        });

        RxBus.getDefault().subscribe(activity, MY_TAG, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("with " + s);
            }
        });
    }

    public static void postToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event);
    }

    public static void postWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event, MY_TAG);
    }

    public static void postStickyToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event);
    }

    public static void postStickyWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event, MY_TAG);
    }

    public static void unregisterRxBusManagerActivity(final RxBusManagerActivity activity) {
        RxBus.getDefault().unregister(activity);
    }
}
複製代碼

能夠看出這是在 RxBusManagerActivity 中要使用 RxBus 的相關代碼,這樣能夠更方便地管理應用中全部的事件總線,而不至於發了個事件都不清楚接收方在哪的尷尬。github

How it comes

網上現有 RxBus 存有的問題:ide

  1. 使用的 RxBus 大多停留在 RxJava1 版本
  2. RxBus 實現的粘性事件不少都是有問題的
  3. 若是事件拋了異常,以後便再也沒法接收到的問題
  4. 同類型事件需本身再次封裝 Bean 進行區別。

介於以上問題,我仍是親自封裝一個簡潔的供你們使用,庫已經依賴了 RxAndroid 和 RxJava,因此導入了該庫的就不須要再額外導入那兩庫了。svg

固然,若是通訊頻率比較高追求效率的話仍是推薦使用 EventBuspost

Principle

  1. 利用 FlowableProcessor 既能夠做爲觀察者又能夠做爲被觀察者來實現事件總線
  2. 粘性事件原理就是發送的時候把事件存到一個 hash 表中,在註冊的時候查詢下 hash 表中是否存在符合的事件,有的話就消費掉便可
  3. 替換原有 LambdaSubscriber 來讓拋了異常以後能夠繼續接收到後續事件
  4. 封裝了 TagMessage 來區分不一樣類別的 tag
  5. 動態識別範型對象來省去傳入 Type 類型

還有一些細節就本身看源碼去了解吧,總共有用的代碼不超過 300 行哈。this

Change log

若是正好幫到了你,那可真是巧了哈,歡迎來個人 狗窩 坐坐。spa

相關文章
相關標籤/搜索