RxBus使用总结

来源:互联网 发布:福州锐捷网络招聘 编辑:程序博客网 时间:2024/06/03 21:05

RxBus

标签(空格分隔): 工具使用


学习YoKey的相关博客的总结

使用

1.引入依赖

dependencies {  ...  compile 'io.reactivex:rxjava:1.1.5'  compile 'io.reactivex:rxandroid:1.2.0'}

2.新建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);    }}

3.定义事件类型(实体类)

public class UserEvent {    private String id;    private String name;    public UserEvent(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;    }}

4.订阅消息

 RegisterSubscription(RxBus.getDefault().toObservable(UserEvent.class).subscribe(user -> {            tvA.setText(user.getId());            tvB.setText(user.getName());        }));

5.发布消息

  RxBus.getDefault().post(new UserEvent("1", "LaLa"));

注意

1.订阅消息的解绑
可以再Base类中添加统一注册和解绑的代码,CompositeSubscription就是个Subscription的集合,可以统一解绑所有的Subscription,但是是一次性的,所以解绑后要置空.反正只要解绑就行,在哪里解绑看业务需求

public class BaseActivity extends AppCompatActivity {    public CompositeSubscription mBaseSubscription;    @Override    protected void onDestroy() {        super.onDestroy();        unRegisterSubscription();    }    /**     * 取消订阅     */    public void unRegisterSubscription() {        if (mBaseSubscription != null && (!mBaseSubscription.isUnsubscribed())) {            mBaseSubscription.unsubscribe();            mBaseSubscription = null;        }    }    /**     * 开始订阅     */    public void RegisterSubscription(Subscription subscription) {        if (mBaseSubscription == null)            mBaseSubscription = new CompositeSubscription();        mBaseSubscription.add(subscription);    }}

2.订阅代码最好加try-catch,因为如果崩了,rx就直接调用onError并不在接收后续消息,所以最好处理下
3.订阅代码可以按业务需求添加操作

RxBus.getDefault()                .toObservable(FileLoadEvent.class)                .onBackpressureBuffer()                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(fileLoadEvent -> {                    progress(fileLoadEvent.getProgress(), fileLoadEvent.getTotal());                })

其他

1.粘性消息,需要时再添加,参考YoKey博客

0 0