Android之RxBus詳解

來源:互聯網
上載者:User

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了,那是不是體積更小了。

至於用哪個,還是看個人喜好吧。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.