- 首先使用rxjava封装了一个Rxbus
public class RxBus {
private static final String TAG = RxBus.class.getSimpleName();
private static RxBus instance;
public static boolean DEBUG = BuildConfig.LOG_DEBUG;
private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();
private RxBus() {
}
public static RxBus get() {
if (null == instance) {
synchronized (RxBus.class) {
if (null == instance) {
instance = new RxBus();
}
}
}
return instance;
}
/**
* rxBus的注册方法
* @param tag
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public <T> Observable<T> register(@NonNull Object tag) {
//可以为同一个tag 注册多个
List<Subject> subjectList = subjectMapper.get(tag);
if (null == subjectList) {
subjectList = new ArrayList<>();
subjectMapper.put(tag, subjectList);
}
Subject<T, T> subject;
//使用replaysubject 可以先发送事件,在订阅
subjectList.add(subject = ReplaySubject.create());
if (DEBUG) Log.d(TAG, "[register]subjectMapper: " + subjectMapper);
return subject;
}
/**
* rxBus的取消注册
* @param tag
* @param observable
*/
public void unregister(@NonNull Object tag, @NonNull Observable observable) {
List<Subject> subjects = subjectMapper.get(tag);
if (null != subjects) {
subjects.remove((Subject) observable);
if (isEmpty(subjects)) {
subjectMapper.remove(tag);
}
}
if (DEBUG) Log.d(TAG, "[unregister]subjectMapper: " + subjectMapper);
}
/**
* 发布事件
* @param tag
* @param content
*/
@SuppressWarnings("unchecked")
public void post(@NonNull Object tag, @NonNull Object content) {
List<Subject> subjectList = subjectMapper.get(tag);
if (!isEmpty(subjectList)) {
//同一个tag 都发布事件
for (Subject subject : subjectList) {
subject.onNext(content);
}
}
if (DEBUG) Log.d(TAG, "[send]subjectMapper: " + subjectMapper);
}
public boolean isEmpty(List list) {
if (list != null) {
if (list.size() == 0) {
return true;
} else {
return false;
}
}
return true;
}
}
2.下面就RxManager的封装
public class RxManager {
public RxBus mRxBus = RxBus.get(); //拿到rxBus
//管理rxbus订阅
private Map<String, Observable<?>> mObservables = new HashMap<>();
/*管理Observables 和 Subscribers订阅*/
private CompositeSubscription mCompositeSubscription = new CompositeSubscription();
/**
* RxBus订阅
* @param eventName
* @param action1
*/
public <T>void on(String eventName, Action1<T> action1) {
Observable<T> mObservable = mRxBus.register(eventName);
mObservables.put(eventName, mObservable);
/*订阅管理*/
mCompositeSubscription.add(mObservable.observeOn(AndroidSchedulers.mainThread())
.subscribe(action1, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
//处理错误信息
throwable.printStackTrace();
}
}));
}
/**
* 单纯的Observables 和 Subscribers管理
* @param m
*/
public void add(Subscription m) {
/*订阅管理*/
mCompositeSubscription.add(m);
}
/**
* 单个presenter生命周期结束,取消订阅和所有rxbus观察
*/
public void clear() {
mCompositeSubscription.unsubscribe();// 取消所有订阅
for (Map.Entry<String, Observable<?>> entry : mObservables.entrySet()) {
mRxBus.unregister(entry.getKey(), entry.getValue());// 移除rxbus观察
}
mObservables.clear();
mObservables = null;
mRxBus = null;
mCompositeSubscription = null;
}
//发送rxbus
public void post(Object tag, Object content) {
mRxBus.post(tag, content);
}
3.说一下使用的方法
一般我们都有BaseActivity,所以只要在BaseActivity里面创建好RxManager的对象,然后在onDestroy里面调用mRxManager.clear();在对应的子类activity中如果是要使用rxbus就只需要调用mRxManger.on(tag,Action1)方法就可以完成注册,使用普通的rxjava也只需要调用mRxManger.add()方法将创建的Observable添加进去即可.所有的rxjava的生命周期的管理就交给了RxManager