简介
RxBus核心功能基于Rxjava。RxJava含Subject类(继承Observable类并实现Observer接口),可同时作订阅者和被订阅者。
资料
依赖
implementation 'io.reactivex:rxjava:1.3.4'
implementation 'io.reactivex:rxandroid:1.2.1'
实现
RxBus
package widget.rxbus;
import java.util.HashMap;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subscriptions.CompositeSubscription;
/**
* Created on 2019/6/17.
*
* @author 郑少鹏
* @desc RxBus
*/
public class RxBus {
private static volatile RxBus mInstance;
private SerializedSubject<Object, Object> mSubject;
private HashMap<String, CompositeSubscription> mSubscriptionMap;
private RxBus() {
mSubject = new SerializedSubject<>(PublishSubject.create());
}
public static RxBus getInstance() {
if (mInstance == null) {
synchronized (RxBus.class) {
if (mInstance == null) {
mInstance = new RxBus();
}
}
}
return mInstance;
}
/**
* 发事件
*
* @param o Object
*/
public void post(Object o) {
mSubject.onNext(o);
}
/**
* 返指定类型Observable实例
*
* @param type 类型
* @param <T> Observable实例
* @return Observable实例
*/
public <T> Observable<T> tObservable(final Class<T> type) {
return mSubject.ofType(type);
}
/**
* 已有观察者订阅否
*
* @return 已有观察者订阅否
*/
public boolean hasObservers() {
return mSubject.hasObservers();
}
/**
* 默订阅法
*
* @param type Class
* @param next Action1
* @param error Action1
* @param <T> Subscription
* @return Subscription
*/
public <T> Subscription doSubscribe(Class<T> type, Action1<T> next, Action1<Throwable> error) {
return tObservable(type)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(next, error);
}
/**
* 存订阅后Subscription
*
* @param o Object
* @param subscription Subscription
*/
public void addSubscription(Object o, Subscription subscription) {
if (mSubscriptionMap == null) {
mSubscriptionMap = new HashMap<>();
}
String key = o.getClass().getName();
if (mSubscriptionMap.get(key) != null) {
mSubscriptionMap.get(key).add(subscription);
} else {
CompositeSubscription compositeSubscription = new CompositeSubscription();
compositeSubscription.add(subscription);
mSubscriptionMap.put(key, compositeSubscription);
}
}
/**
* 取订阅
*
* @param o Object
*/
public void unSubscribe(Object o) {
if (mSubscriptionMap == null) {
return;
}
String key = o.getClass().getName();
if (!mSubscriptionMap.containsKey(key)) {
return;
}
if (mSubscriptionMap.get(key) != null) {
mSubscriptionMap.get(key).unsubscribe();
}
mSubscriptionMap.remove(key);
}
}
NewsModel
package widget.rxbus;
/**
* Created on 2019/6/17.
*
* @author 郑少鹏
* @desc NewsModel
*/
public class NewsModel {
private int code;
public NewsModel(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
使用
@Override
protected void initContentView(Bundle savedInstanceState) {
setContentView(R.layout.activity_pharmaceutical_knowledge_list);
doSubscribe();
}
/**
* 订阅
*/
public void doSubscribe() {
Subscription subscription = RxBus.getInstance()
.tObservable(NewsModel.class)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<NewsModel>() {
@Override
public void call(NewsModel model) {
if (model.getCode() == 100) {
LogManager.e("收到事件");
}
}
});
RxBus.getInstance().addSubscription(this, subscription);
}
@Override
protected void onDestroy() {
super.onDestroy();
RxBus.getInstance().unSubscribe(this);
}