原文連接:http://lingyunzhu.github.iohtml
RxJava目前已經很火了,若是你還沒有了解請看這裏。對於RxJava這裏很少作介紹。
RxBus並非一個庫,而是一種模式。相信大多數開發者都使用過EventBus,做爲事件總線通訊庫,若是你的項目已經加入RxJava和EventBus,不妨用RxBus代替EventBus,以減小庫的依賴。java
//RxJava and RxAndroid compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.0'
很少說直接上代碼:react
import rx.Observable; import rx.subjects.PublishSubject; import rx.subjects.SerializedSubject; import rx.subjects.Subject; /** * Created by xialo on 2016/6/28. */ 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); } }
一、Subject同時充當了Observer和Observable的角色,Subject是非線程安全的,要避免該問題,須要將 Subject轉換爲一個 SerializedSubject,上述RxBus類中把線程非安全的PublishSubject包裝成線程安全的Subject。
二、PublishSubject只會把在訂閱發生的時間點以後來自原始Observable的數據發射給觀察者。
三、ofType操做符只發射指定類型的數據,其內部就是filter+castandroid
咱們這裏用StudentEvent舉例git
/** * Created by xialo on 2016/6/28. */ 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以方便生命週期結束時取消訂閱事件github
@Override protected void onDestroy() { if (!rxSbscription.isUnsubscribed()){ rxSbscription.unsubscribe(); } super.onDestroy(); }