天天看點

[Android]基于RxJava、RxAndroid的EventBus實作

以下内容為原創,歡迎轉載,轉載請注明

EventBus的作用是釋出/訂閱事件總線,因為項目中用到RxJava、RxAndroid,是以完全可以使用RxJava、RxAndroid來實作EventBus。

1. 編寫RxBus,用于存儲所有事件Subjects。

事件是傳遞的最小機關,可以把任何類作為一個事件。

RxBus代碼如下:

如上述代碼,RxBus隻提供了register、unregister、post三個方法。

這裡又加入了一個tag的概念,也可以了解為channel,注冊Subject、反注冊Subject和post事件的時候都需要這個tag,隻有tag一緻才能正常接收到事件。

比如有一個事件類HelloEvent,這個事件的作用是接收到後toast一個提示“hello”,如果兩個Activity都注冊了這個HelloEvent事件,但是沒有tag去限制,一旦post了一個helloEvent事件後,兩個Activity都會收到這個事件,導緻兩個Activity都會toast。如果使用tag,post這個HelloEvent的時候可以設定這個tag,隻有register時也使用了這個tag才會接收到這個event。

2. 在Present(如Activity的onCreate)中注冊一個Observer(以下以發送一個String類型的事件為例)

如上,注冊了一個String類型的事件,事件的tag是“addFeedTag”,用來增加一個Feed。使用RxAndroid在Action1中處理接收到的這個事件。

3. 在任何地方發送一個事件:

這裡發送了一個tag為“addFeedTag”的String類型的事件。

4. 反注冊Observer:

注意:這裡的Tag都為“addFeedTag”。

下面使用注解的方式更簡單友善地使用RxBus(嗯-。-這裡才是重點)。

首先來看下使用注解後的代碼:

1. 注冊Observer

這一步可以省略掉。

2. 發送一個事件(這裡我們換一個事件:FeedItemClickEvent,我們定義這個事件是用來處理當Feed被點選後的事件)

3. 接收事件,然後處理

如上,這裡隻需要編寫一個方法,加上Accept注解,然後在方法中進行事件處理即可。

注意:方法名可以任意

方法參數一:必須為Object類型的tag;

方法參數二,如果這個方法隻接收一種事件,則寫明具體的事件類型,如上;如果這個方法接收多種事件,則類型需要為Object。

4. 反注冊Observer

這一步也可以省略掉。

接收多種事件:

這裡@Accept注解中設定了acceptScheduler為AcceptScheduler.NEW_THREAD,指明方法運作在子線程中.

value中指明了接收的事件類型,這裡表示這個方法接收4種類型的事件:CLOSE, BACK, EDIT, REFRESH.

注解解釋:

@Accept注解

acceptScheduler: 指定被注解的方法運作的Scheduler。

value[]: AcceptType注解數組,用于指定接收事件的tag和class。

@AcceptType注解:

tag: 接收事件的tag

clazz: 接收事件的類型

AcceptScheduler:

詳情見:rx.schedulers.Schedulers和rx.android.schedulers.AndroidSchedulers

如果設定的是AcceptScheduler.EXECUTOR或AcceptScheduler.HANDLER,則需要在Application中配置Executor和Handler:

繼續閱讀