2016年,RxJava/RxAndroid大火,很多人都加入到響應式編程的行列,今天我們來聊聊RxBus
以前我們要想在activity或fragment之間傳遞資訊,我們會通過onActvityResult接收資訊。但是這樣有一個缺點,一個是代碼量太大,重複率太高。二是有時候傳遞的資料需要經過幾個介面的跳轉。加入從A->B->C,C介面修改了某些資訊,同時,想在A介面進行介面的重新整理。那麼通過onActvityResult的話很難操作。還有就是,加入從A->B,B傳遞資訊給A介面。以往通過onActvityResult,我們需要在B介面關閉的時候,A介面才能拿到資料,再進行局部重新整理,這樣的話,A介面很可能會閃爍(資料重新整理)。這樣的話使用者體驗感就很差了。那麼現在,我們可以怎麼做呢。
在未使用Rxjava之前,我用EventBus來進行組件之間的通訊。今天我們暫且不講EventBus了,我們來講講RxBus。
首先,大家最好先瞭解一下Rxjava,下面是簡單的介紹:
簡介轉載自:
http://www.imooc.com/article/2298
代碼思路來自:
http://www.jianshu.com/p/ca090f6e2fe2
RxJava 是 ReactiveX 在 Java 上的開源的實現。Observable(觀察者) 和 Subscriber(訂閱者)是兩個主要的類。在 RxJava 上,一個 Observable 是一個發出資料流或者事件的類,Subscriber 是一個對這些發出的 items (資料流或者事件)進行處理(採取行動)的類。一個 Observable 的標準流發出一個或多個 item,然後成功完成或者出錯。一個 Observable 可以有多個 Subscribers,並且通過 Observable 發出的每一個 item,該 item 將會被發送到 Subscriber.onNext() 方法來進行處理。一旦 Observable 不再發出 items,它將會調用 Subscriber.onCompleted() 方法,或如果有一個出錯的話 Observable 會調用 Subscriber.onError() 方法。
首先,附上rxjava/rxandroid的連結,或者直接到github搜尋查看最新版本連結
compile 'io.reactivex:rxjava:1.1.0'compile 'io.reactivex:rxandroid:1.1.0'
廢話不多說,直接附上RxBus的代碼
public class RxBus { private static volatile RxBus defaultInstance; private final Subject<Object, Object> bus; // PublishSubject只會把在訂閱發生的時間點之後來自原始Observable的資料發射給觀察者 public RxBus() { bus = new SerializedSubject<>(PublishSubject.create()); } // 單例RxBus public static RxBus getDefault() { if (defaultInstance == null) { synchronized (RxBus.class) { if (defaultInstance == null) { defaultInstance = new RxBus(); } } } return defaultInstance ; } // 發送一個新的事件 public void post (Object o) { bus.onNext(o); } // 根據傳遞的 eventType 類型返回特定類型(eventType)的 被觀察者 public <T> Observable<T> toObservable (Class<T> eventType) { return bus.ofType(eventType);// 這裡感謝小鄧子的提醒: ofType = filter + cast// return bus.filter(new Func1<Object, Boolean>() {// @Override// public Boolean call(Object o) {// return eventType.isInstance(o);// }// }) .cast(eventType); }}
代碼很簡單,先建立一個單例的Rxbus對象,然後可以通過post發出一個事件,發起者作為一個被觀察者。或者通過toObservable觀察一個事件。
這裡解釋一下rxjava一般來說有三種動作:onNext,onComplete,OnError.分別對應接下來的動作,還有完成時的動作,出錯時的動作。
public Observable toObservable (Class eventType)
這裡通過泛型傳入一個對象,然後對這個對象進行觀察。
那現在可以通過代碼來介紹一下如何發起一個事
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String username, String password) { this.username = username; this.password = password; }}User user = new User("潘銳傑","123456");RxBus.getDefault().post(user);
首先,我們要建立一個User對象,作為我們所要發出去的資料。
然後new出一個對象,通過RxBus.getDefault().post();將資料發出去,那麼此時,對這個事件訂閱的,就會接收到一個通知。其實rxjava就是觀察者模式的一個實現。
那麼,我們看看怎麼接收到資料,代碼如下:
RxBus.getDefault().toObservable(User.class) //在io線程進行訂閱,可以執行一些耗時操作 .subscribeOn(Schedulers.io()) //在主線程進行觀察,可做UI更新操作 .observeOn(AndroidSchedulers.mainThread()) //觀察的對象 .subscribe(user->{ //擷取到了一個對象,user Toast.makeText(this,user.getUsername(),Toast.LENGTH_SHORT).show(); });
觀察對象的時候我使用了lambda運算式進行簡寫,這是JAVA8的新特性,有興趣的可以去瞭解一下,還有一些操作符,如map,flatmap,filter,zip等操作,這裡就不做示範了。
這裡的代碼效果和上面的代碼是一樣的,如果使用了java8的朋友,在new Action1() 這裡按一下ALT+ENTER,就可以進行簡化代碼。
RxBus.getDefault().toObservable(InvitationMessage.class) //在io線程進行訂閱,可以執行一些耗時操作 .subscribeOn(Schedulers.io()) //在主線程進行觀察,可做UI更新操作 .observeOn(AndroidSchedulers.mainThread()) //觀察的對象 .subscribe(new Action1<User>() { @Override public void call(User user) { Toast.makeText(this,user.getUsername(),Toast.LENGTH_SHORT).show(); } });
有人說,那這樣的話,rxbus跟eventBus做的東西不就一樣了嗎。那直接用eventBus不就好了。
Rx:函數響應式編程,EventBus:事件匯流排
RxJava 主要做非同步、網路的資料處理,強大之處就是資料的處理了,而對於處理完後的資料處理是一樣的都是觀察者模式來通知 ,通過操作符可以執行鏈式調用,代碼清晰。
結合retrofit2,做網路請求的話,可以讓網路請求變的十分優雅,當然,使用RxJava那就不用匯入eventbus了,那是不是體積更小了。
至於用哪個,還是看個人喜好吧。。。