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博客