EventBus介绍:
Rx:函数响应式编程,EventBus:事件总线 。
EventBus 功能类似handler,通过一个类来发送post()信息,具体使用方法如下:
-
发送:
EventBus.getDefault().post(new EventBussBean("demo执行了"));
-
两种接收方式:
EventBus注册 :EventBus.getDefault().register(this); EventBus反注册:EventBus.getDefault().unregister(this);
-
用自带的方法接收,有4个方法:
- onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
- onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
- onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
- onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
注意: Activity中当有多个onEvent(或其他3个)时,参数的不同则是区分的关键:
public void onEventMainThread(FirstEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } public void onEventMainThread(SecondEvent event) { //消息会根据接收类的不同,自动区分调用 Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); }
-
自定义接收方法:
* 先在onCreate中注册: EventBus.getDefault().register(this); * 然后自定义接收方法: @Subscribe(sticky = true,threadMode = ThreadMode.POSTING) //粘性sticky作用:能接收到注册前的消息,发送时也需用postSticky(); public void getMessage (EventBussBean evn) { evn.execute1(); } * 最后反注册:EventBus.getDefault().unregister(this);
.
RxBus介绍:
EventBus采用事件总线,RxBus采用函数响应式编程方式实现,二者用谁做事件传递均可;
RxJava提供给开发者5种Subject:
PublishSubject:只会给把订阅的时间点之后的数据发送给观察者。
BehaviorSubject:在订阅者订阅时,会发送其最近发送的数据(如果此时还没有收到任何数据,它会发送一个默认值)。
ReplaySubject:在订阅者订阅时,会发送所有的数据给订阅者,无论它们是何时订阅的。
AsyncSubject:只在原Observable事件序列完成后,发送最后一个数据,后续若还有订阅者继续订阅该Subject, 则可以直接接收到最后一个值
SerializedSubject:待定;
RxBus是自己定义出来的,可用于替代handler和EventBus,主要用来处理应用程序间各个组件的通信,或者组件与组建之间的数据传递,不用再像BroadcastReceiver一样,把数据封装到intent里面再传递出去了。RxBus学的是一种思路,RxBus其实就是对Subject(Observable和Observer的子类)的功能的封装( class Subject<T, R> extends Observable<R> implements Observer<T> {})。
- RxBus自定义:
public class RxBus {
private static volatile RxBus mDefaultInstance;
private final Subject<Object, Object> mBus;
private final Map<Class<?>, Object> mStickyEventMap;
public RxBus() {
mBus = new SerializedSubject<>(PublishSubject.create());
mStickyEventMap = new ConcurrentHashMap<>();
}
public static RxBus getDefault() {
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(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 Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
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();
}
}
}
- RxBus使用举例
/*
* 发送端:
* 可以替换成String类型post(new BaseBean ());接收处toObservableSticky(String.class)
*/
RxBus.getDefault().post(new BaseBean ());
/*
* 接收端:
*/
RxBus.getDefault().toObservableSticky(BaseBean.class)
//在io线程进行订阅,可以执行一些耗时操作
.subscribeOn(Schedulers.io())
//在主线程进行观察,可做UI更新操作
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//观察的对象
.subscribe(user->{
//获取到了一个对象,user
Toast.makeText(this,user.getUsername(),Toast.LENGTH_SHORT).show();
});
注意:Subscription、Observer都是接口,Subscriber是抽象类,Observable是普通类;
.