1. 程式人生 > >RxJava和RxBus代替EventBus

RxJava和RxBus代替EventBus

最近在學習Rxjava相關的知識,發現我們完全可以用Rxjava裡面的知識來代替以前專案中使用的EventBus.

在介紹實現前,先說說幾點可能會有疑惑的問題:

首先,明確一下RxBus的概念

      RxBus 名字看起來像一個庫,但它並不是一個庫,而是一種模式,它的思想是使用 RxJava 來實現了 EventBus ,而讓你不再需要使用OTTO或者 GreenRobot 的EventBus。

其次,為什麼要使用RxBus來代替EventBus

     我之所以想用RxBus來代替EventBus,一是為了自己更加熟悉Rxjava的相關用法,二是為了減少程式引用的第三方庫(既然都用了Rxjava 沒必要再去引入EventBus)。

當然,如果對Rxjava沒有一點了解,或者說只是想簡單的使用EventBus的功能,建議還是使用Otto或者GreenRobot的EventBus,這二者都可以通過註解非常簡單的使用。

下面是正文:

public class RxBus {
private static RxBus instance;
private Vector<Subject> subjectList = new Vector<>();

private RxBus() {
}

public static synchronized RxBus getInstance() {
if (null == instance) {
instance = new RxBus();
}
return instance;
}

public synchronized <T> Observable<T> register(@NonNull Object object) {
Subject<T, T> subject = PublishSubject.create();
subjectList.add(subject);
return subject;
}

public synchronized void unregister(Object object) {
subjectList.remove(object);
}

public void post(@NonNull Object content) {
synchronized (this) {
for (Subject subject : subjectList) {
if (subject != null) {
subject.onNext(content);
}
}
}
}

}

Rxbus程式碼如上,使用方式和EventBus一樣,在合適的地方(比如oncreate 或者 onResume)註冊,和取消註冊(如onPause和onDestroy),在初始化同時,我們可以指定接收後所執行的執行緒等其他操作

Observable<UserBean> observable = RxBus.getInstance().register(this);
observable.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<UserBean>() {
    @Override
    public void call(UserBean userBean) {
        Log.d("Test", "received :" + userBean.toString());
    }
});
RxBus.getInstance().unregister(this);
傳送事件的方式:
RxBus.getInstance().post(new UserBean("rxbus", 99));

當然我們還可以在這個的基礎上加上註解的方式 來讓實現更方便,這個就留著後面再處理了!