RxBus使用总结

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值