這個 RxBus 穩(wěn)如老狗

logo
logo

![rb][rbsvg] ![License][licensesvg]

Download

Gradle:

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. 發(fā)送事件
// 發(fā)送 String 類型事件
RxBus.getDefault().post("without tag");

// 發(fā)送帶 tag 為 "my tag" 的 String 類型事件
RxBus.getDefault().post("with tag", "my tag");

粘性事件(也就是先發(fā)送事件容达,在之后注冊的時候便會收到之前發(fā)送的事件)

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

// 發(fā)送帶 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 中做的封裝如下所示:

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 的相關代碼尸折,這樣可以更方便地管理應用中所有的事件總線破喻,而不至于發(fā)了個事件都不清楚接收方在哪的尷尬超营。

How it comes

網上現有 RxBus 存有的問題:

  1. 使用的 RxBus 大多停留在 RxJava1 版本
  2. RxBus 實現的粘性事件很多都是有問題的
  3. 如果事件拋了異常协屡,之后便再也無法接收到的問題
  4. 同類型事件需自己再次封裝 Bean 進行區(qū)別宫蛆。

介于以上問題,我還是親自封裝一個簡潔的供大家使用栅贴,庫已經依賴了 RxAndroid 和 RxJava斟湃,所以導入了該庫的就不需要再額外導入那兩庫了。

當然檐薯,如果通信頻率比較高追求效率的話還是推薦使用 EventBus

Principle

  1. 利用 FlowableProcessor 既可以作為觀察者又可以作為被觀察者來實現事件總線
  2. 粘性事件原理就是發(fā)送的時候把事件存到一個 hash 表中,在注冊的時候查詢下 hash 表中是否存在符合的事件坛缕,有的話就消費掉即可
  3. 替換原有 LambdaSubscriber 來讓拋了異常之后可以繼續(xù)接收到后續(xù)事件
  4. 封裝了 TagMessage 來區(qū)分不同類別的 tag
  5. 動態(tài)識別范型對象來省去傳入 Type 類型

還有一些細節(jié)就自己看源碼去了解吧墓猎,總共有用的代碼不超過 300 行哈。

Change log

如果正好幫到了你赚楚,那可真是巧了哈毙沾,歡迎來我的 狗窩 坐坐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末宠页,一起剝皮案震驚了整個濱河市左胞,隨后出現的幾起案子,更是在濱河造成了極大的恐慌举户,老刑警劉巖烤宙,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異俭嘁,居然都是意外死亡躺枕,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門供填,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拐云,“玉大人,你說我怎么就攤上這事近她〔娲瘢” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵粘捎,是天一觀的道長薇缅。 經常有香客問我,道長晌端,這世上最難降的妖魔是什么捅暴? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮咧纠,結果婚禮上蓬痒,老公的妹妹穿的比我還像新娘。我一直安慰自己漆羔,他們只是感情好梧奢,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著演痒,像睡著了一般亲轨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸟顺,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天惦蚊,我揣著相機與錄音器虾,去河邊找鬼。 笑死蹦锋,一個胖子當著我的面吹牛兆沙,可吹牛的內容都是我干的。 我是一名探鬼主播莉掂,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼葛圃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了憎妙?” 一聲冷哼從身側響起库正,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厘唾,沒想到半個月后褥符,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡阅嘶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年属瓣,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讯柔。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡抡蛙,死狀恐怖,靈堂內的尸體忽然破棺而出魂迄,到底是詐尸還是另有隱情粗截,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布捣炬,位于F島的核電站熊昌,受9級特大地震影響,放射性物質發(fā)生泄漏湿酸。R本人自食惡果不足惜婿屹,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望推溃。 院中可真熱鬧昂利,春花似錦、人聲如沸铁坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硬萍。三九已至扩所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朴乖,已是汗流浹背祖屏。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工助赞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赐劣。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓嫉拐,卻偏偏與公主長得像哩都,于是被迫代替她去往敵國和親魁兼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx漠嵌?那么一定聽過它的“同行”Apache吧咐汞!Ngi...
    JokerW閱讀 32,642評論 24 1,002
  • 發(fā)現 關注 消息 iOS 第三方庫、插件儒鹿、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 摩洛哥的一次撒歡 我已經很久沒有寫過東西了 大概有四年了 上了大學后的閑散與不務正業(yè) 讓我現在每天活在壓抑的心情里...
    優(yōu)秀的姑娘閱讀 765評論 0 0
  • 今天聽說了一些坊間傳聞化撕,道門已經通傳天下: “建國后成精的”一律歸我們道教協會精怪辦管理,嚴厲打擊非法成精约炎,雷劫指...
    道天生閱讀 258評論 0 1