eventType) {
return mBus.ofType(eventType);
}
/**
* 判断是否有订阅者
*/
public boolean hasObservers() {
return mBus.hasObservers();
}
public void reset() {
mDefaultInstance = null;
}
}
使用RxBus
事件实体
public class MsgEvent {
private String msg;
public MsgEvent(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
订阅事件
RxBus.getInstance().toObservable(MsgEvent.class).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MsgEvent msgEvent) {
//处理事件
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
发送事件
RxBus.getInstance().post(new MsgEvent("Java"));
与EventBus对比,除了订阅事件的消息处理,使用基本一样。
至于EventBus的线程模型,我们完全可以使用RxJava 的线程控制Scheduler来实现,具体可以参考上面RxJava的使用两篇文章。
RxBus内存泄漏
使用RxJava发布一个订阅后,当页面被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity/Fragment无法被回收,从而引发内存泄漏。
EventBus为了解决这个问题,要求我们根据订阅者的生命周期注册和取消注册。所以在RxBus中我们也可以这样操作。
简单处理
使用一个CompositeDisposable存储当前所有的订阅,然后再onDestroy()中将其dispose()。
private CompositeDisposable compositeDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
compositeDisposable = new CompositeDisposable();
RxBus.getInstance().toObservable(MsgEvent.class).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onNext(MsgEvent msgEvent) {
//事件处理
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
if (compositeDisposable!=null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
}
RxLifecycle
Rxlifecycle 是trello开发的用于解决RxJava引起的内存泄漏的开源框架。
GitHub地址:https://github.com/trello/RxLifecycle
该框架为了适应不同的场景,开发了不同的版本,具体的可以查看GitHub文档:
// RxLifecycle基础库
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
// Android使用的库,可以绑定特定的生命周期
//需继承RxActvivty使用
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'
// Android组件库,里面定义了例如RxAppCompatActivity、RxFragment之类的Android组件
// 须继承RxAppCompatActivity、RxFragment使用
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
// 预先编写的支持首选项片段,将其子类化为提供者
implementation 'com.trello.rxlifecycle2:rxlifecycle-components-preference:2.2.2'
// Android使用的库,须继承NaviActivity使用
implementation 'com.trello.rxlifecycle2:rxlifecycle-navi:2.2.2'
// 使用Android生命周期作为提供者
//无需继承,任何有声明周期的组件都可以直接使用
implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.2'
// Kotlin语法
implementation 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.2'
//在Kotlin语法,使用Android生命周期
implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.2'
如果我们自己有BaseActivity,所以不能继承RxActvivty,RxAppCompatActivity、RxFragment,NaviActivity。
为了保持代码的灵活性,我们使用:
// 使用Android生命周期作为提供者
implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.2'
修改RxBus,添加如下代码:
使用compose(this.bindToLifecycle())方法绑定Activity的生命周期,在onStart方法中绑定,在onStop方法被调用后就会解除绑定,以此类推。
如果在onPause/onStop方法中绑定,那么就会在它的下一个生命周期方法(onStop/onDestory)被调用后解除绑定。
绑定 |
销毁 |
onCreate |
onDestory |
onStart |
onStop |
onResum |
onPause |
onPause |
onStop |
onStop |
onDestory |
/**
* 使用Rxlifecycle解决RxJava引起的内存泄漏
*/
public Observable toObservable(LifecycleOwner owner, final Class eventType) {
LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner);
return mBus.ofType(eventType).compose(provider.bindToLifecycle());
}
订阅事件时,添加上下文this即可绑定生命周期,自动取消订阅:
RxBus.getInstance().toObservable(this,MsgEvent.class).subscribe(new Consumer() {
@Override
public void accept(MsgEvent msgEvent) throws Exception {
//处理事件
}
});
RxBus的粘性事件
EventBus有粘性事件,RxBus也可以实现。
修改RxBus修改&添加如下代码:
private final Map, Object> mStickyEventMap;
private RxBus() {
mBus = PublishSubject.create().toSerialized();
mStickyEventMap = new ConcurrentHashMap<>();
}
/**
* 发送一个新Sticky事件
*/
public void postSticky(Object event) {
synchronized (mStickyEventMap) {
mStickyEventMap.put(event.getClass(), event);
}
post(event);
}
/**
* 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
* 使用Rxlifecycle解决RxJava引起的内存泄漏
*/
public Observable toObservableSticky(LifecycleOwner owner,final Class eventType) {
synchronized (mStickyEventMap) {
LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner);
Observable observable = mBus.ofType(eventType).compose(provider.bindToLifecycle());
final Object event = mStickyEventMap.get(eventType);
if (event != null) {
return observable.mergeWith(Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter subscriber) throws Exception {
subscriber.onNext(eventType.cast(event));
}
}));
} else {
return observable;
}
}
}
/**
* 根据eventType获取Sticky事件
*/
public T getStickyEvent(Class eventType) {
synchronized (mStickyEventMap) {
return eventType.cast(mStickyEventMap.get(eventType));
}
}
/**
* 移除指定eventType的Sticky事件
*/
public T removeStickyEvent(Class eventType) {
synchronized (mStickyEventMap) {
return eventType.cast(mStickyEventMap.remove(eventType));
}
}
/**
* 移除所有的Sticky事件
*/
public void removeAllStickyEvents() {
synchronized (mStickyEventMap) {
mStickyEventMap.clear();
}
}
RxBus完整代码
public class RxBus {
private volatile static RxBus mDefaultInstance;
private final Subject