使用Rxjava有一段时间了,最近发现Rxbus和Rxjava配合使用体验很好,于是记录一下
首先说一下RxBus是什么?
一句话概括:用注册订阅者模式实现的通讯方式。
简简单单的一个 观察者observable 与 Subscriber。RxBus并不是一个库,而是一种模式,用过EventBus的都知道采用了观察者模式。如果我们在使用Rxjava了,并且减少库的依赖,那么我们可以用RxBus去代替EventBus。
RxBus能在项目中做什么
它是以observable 与 Subscriber 实现的,正常注册订阅所传递的参数我们都是可以传递的。在项目中我们不例外的都是
Activity,Fragment 互相与各自间的传递 String Object!完全够用是不是!传递对象的时候序列化对象也不是那么必要的。
是不是感觉很方便,一步post调任何Object与String的参数。越厉害 越简单
我们为什么要在项目中使用
1,当我们项目已经导入了Rxjava,RxAndroid 的时候,你自己创造的Rxbus能替换掉EventBus,瞬间发觉自己好牛是不是。而且项目中也少一个三方库,Apk也瘦身了。
2,方便易用,一个你自己完成的极简通讯方式,更不容易出现未知的bug。它的效率也是毋庸置疑的,很多大项目都是自己创建Rxbus取代EventBus的使用。
使用步骤如下:
1.第一步———添加Rxjava和RxAndroid依赖:
在App的build.gradle目录下添加
implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
2.第二步————新建RxBus基类:
/**
* @作者: njb
* @时间: 2019/8/28 17:59
* @描述:
*/
public class RxBus {
private volatile static RxBus mDefaultInstance;
private final Subject<Object> mBus;
private final Map<Class<?>, Object> mStickyEventMap;
public RxBus() {
mBus = PublishSubject.create().toSerialized();
mStickyEventMap = new ConcurrentHashMap<>();
}
public static RxBus getInstance() {
if (mDefaultInstance == null) {
synchronized (RxBus.class) {
if (mDefaultInstance == null) {
mDefaultInstance = new RxBus();
}
}
}
return mDefaultInstance;
}
/**
* 发送事件
*/
public void post(Object event) {
mBus.onNext(event);
}
/**
* 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
*/
public <T> Observable<T> toObservable(final Class<T> eventType) {
return mBus.ofType(eventType);
}
/**
* 判断是否有订阅者
*/
public boolean hasObservers() {
return mBus.hasObservers();
}
public void reset() {
mDefaultInstance = null;
}
/**
* Stciky 相关
*/
/**
* 发送一个新Sticky事件
*/
public void postSticky(Object event) {
synchronized (mStickyEventMap) {
mStickyEventMap.put(event.getClass(), event);
}
post(event);
}
/**
* 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
*/
public <T> Observable<T> toObservableSticky(final Class<T> eventType) {
synchronized (mStickyEventMap) {
Observable<T> observable = mBus.ofType(eventType);
final Object event = mStickyEventMap.get(eventType);
if (event != null) {
return observable.mergeWith(Observable.create(new ObservableOnSubscribe<T>() {
@Override
public void subscribe(ObservableEmitter<T> subscriber) throws Exception {
subscriber.onNext(eventType.cast(event));
}
}));
} else {
return observable;
}
}
}
/**
* 根据eventType获取Sticky事件
*/
public <T> T getStickyEvent(Class<T> eventType) {
synchronized (mStickyEventMap) {
return eventType.cast(mStickyEventMap.get(eventType));
}
}
/**
* 移除指定eventType的Sticky事件
*/
public <T> T removeStickyEvent(Class<T> eventType) {
synchronized (mStickyEventMap) {
return eventType.cast(mStickyEventMap.remove(eventType));
}
}
/**
* 移除所有的Sticky事件
*/
public void removeAllStickyEvents() {
synchronized (mStickyEventMap) {
mStickyEventMap.clear();
}
}
/**
* 普通订阅解绑
* @param disposable
*/
public static void rxBusUnbund(CompositeDisposable disposable){
if (null != disposable && !disposable.isDisposed()) {
disposable.clear();
}
}
}
3.第3步———添加一个事件发送类
/**
* @作者: njb
* @时间: 2019/8/28 18:20
* @描述:
*/
public class WeatherEvent {
private String id;
private String cityName;
private String temperature;
public WeatherEvent(String id, String cityName,String temperature) {
this.id = id;
this.cityName = cityName;
this.temperature = temperature;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
}
4.第四步————发送事件
/**
* @作者: njb
* @时间: 2019/8/28 18:24
* @描述:
*/
public class AddCityActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_send);
initView();
}
private void initView() {
textView = findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
RxBus.getInstance().post(new WeatherEvent("021","西安市","30℃"));
finish();
}
});
}
}
布局代码:
layout_send.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转"
android:textColor="@color/colorAccent"
android:textSize="14sp"
android:layout_gravity="center"/>
</LinearLayout>
5.第五步————接收事件
private void initRxBus() {
compositeDisposable = new CompositeDisposable();
RxBus.getInstance().toObservable(WeatherEvent.class)
.subscribe(new Observer<WeatherEvent>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}
@Override
public void onNext(WeatherEvent weatherEvent) {
Log.e("weather", weatherEvent.getTemperature()+"-**-"+weatherEvent.getCityName());
tvCity.setText(weatherEvent.getTemperature());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
6.取消订阅———由于RxBus基类封装的取消订阅方法,所以直接调用
@Override
protected void onDestroy() {
super.onDestroy();
//取消订阅
RxBus.rxBusUnbund(compositeDisposable);
}
7.测试一下按钮添加传递数据:日志打印数据
以上就是RxBus的简单使用流程,大家可根据项目自行选择使用EventBus还是RxBus,亦或是其他的,没有规定说一定要用那个,那个合适用那个,那个好用选那个,生命不止,学习不止,有问题希望大家指出改进.