RxBus并不是一個庫,而是一種模式。相信大多數開發者都使用過EventBus,作為事件總線通信庫,如果你的項目已經加入Rxjava和EventBus,不妨用RxBus代替EventBus,以減少庫的依賴。
//RxJava and RxAndroid compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.0'二、新建RxBus類
不多說直接上代碼:
import rx.Observable;import rx.subjects.PublishSubject;import rx.subjects.SerializedSubject;import rx.subjects.Subject;/** * Created by ywh on 2017/2/8 */public class RxBus { PRivate static volatile RxBus mInstance; private final Subject bus; public RxBus() { bus = new SerializedSubject<>(PublishSubject.create()); } /** * 單例模式RxBus * * @return */ public static RxBus getInstance() { RxBus rxBus2 = mInstance; if (mInstance == null) { synchronized (RxBus.class) { rxBus2 = mInstance; if (mInstance == null) { rxBus2 = new RxBus(); mInstance = rxBus2; } } } return rxBus2; } /** * 發送消息 * * @param object */ public void post(Object object) { bus.onNext(object); } /** * 接收消息 * * @param eventType * @param <T> * @return */ public <T> Observable<T> toObserverable(Class<T> eventType) { return bus.ofType(eventType); }}1、Subject同時充當了Observer和Observable的角色,Subject是非線程安全的,要避免該問題,需要將 Subject轉換為一個SerializedSubject,上述RxBus類中把線程非安全的PublishSubject包裝成線程安全的Subject。2、PublishSubject只會把在訂閱發生的時間點之后來自原始Observable的數據發射給觀察者。3、ofType操作符只發射指定類型的數據,其內部就是filter+cast
三、創建你需要發送的事件類
我們這里用StudentEvent舉例
/** * Created by ywh on 2017/2/8 */public class StudentEvent { private String id; private String name; public StudentEvent(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}四、發送事件
RxBus.getInstance().post(new StudentEvent("007","小明"));五、接收事件
rxSbscription=RxBus.getInstance().toObserverable(StudentEvent.class) .subscribe(new Action1<StudentEvent>() { @Override public void call(StudentEvent studentEvent) { textView.setText("id:"+ studentEvent.getId()+" name:"+ studentEvent.getName()); } });注:rxSbscription是Sbscription的對象,我們這里把RxBus.getInstance().toObserverable(StudentEvent.class)賦值給rxSbscription以方便生命周期結束時取消訂閱事件
六、取消訂閱
@Override protected void onDestroy() { if (!rxSbscription.isUnsubscribed()){ rxSbscription.unsubscribe(); } super.onDestroy(); }
新聞熱點
疑難解答