EventBus是一款针对Android优化的发布-订阅事件总线,它简化了应用程序内各组件间、组件与后台线程间的通信,优点是更加简洁、更优雅、开销更小,且将发送者和接收者解耦。而RxBus是使用RxJava实现事件总线的一中思想,比EventBus更方便。简单来说RxBus的作用就是方便组件之间的交互,当然,项目中能避免使用RxBus和EventBus就尽量不用。
配置
RxBinding是JakeWharton的一个库,可以响应式的方式处理UI的响应问题,当中已经依赖了RxJava等库,不需要重复依赖。也可以不用RxBingding而直接依赖RxJava的相关库。1
compile 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha1'
使用
RxBus类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17private Subject<Object> bus = PublishSubject.create().toSerialized();
public void post(Object o) {
bus.onNext(o);
}
public <T> Observable<T> toObservable(Class<T> event) {
return bus.ofType(event).onErrorReturn(new Function<Throwable, T>() {
@Override public T apply(@NonNull Throwable throwable) throws Exception {
return null;
}
}).filter(new Predicate<T>() {
@Override public boolean test(@NonNull T t) throws Exception {
return t != null;
}
}).observeOn(AndroidSchedulers.mainThread());
}
BaseFragment类,统一处理所有订阅:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19private CompositeDisposable mCompositeDisposable;
//create方法中:
mCompositeDisposable = new CompositeDisposable();
protected void addDisposable(Disposable mDisposable) {
if (mCompositeDisposable == null) {
mCompositeDisposable = new CompositeDisposable();
}
mCompositeDisposable.add(mDisposable);
}
private void clearDisposable() {
if (mCompositeDisposable != null) {
mCompositeDisposable.clear();
}
}
//destroy方法中:
clearDisposable();
发送者Fragment:1
2
3
4
5btnSend.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
RxBus.getInstance().post(new MessageEvent(DateUtil.getCurrentTime(), "商城界面的事件"));
}
});
接收者Fragment1
2
3
4
5
6
7
8
9//写在初始化方法中,随时准备接收事件
addDisposable(RxBus.getInstance()
.toObservable(MessageEvent.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<MessageEvent>() {
@Override public void accept(MessageEvent messageEvent) throws Exception {
tvHomeAccept.setText(messageEvent.getTime() + "\n接收到 " + messageEvent.getMessage());
}
}));
最后
- 效果
- 项目地址
完