这节我们继续讲述 RxJava1.x 的另一个特性。RxBus,实现消息传递机制。
网上关于RxBus在RxJava1.x上的封装很多,但我觉得调用起来还是不够简洁,于是自己又稍微封装了下。
首先,还是在 app的 module 中引入 RxJava1.x 的依赖:
//rxjava
compile 'io.reactivex:rxjava:1.2.7'//rx对Android的支持
compile 'io.reactivex:rxandroid:1.2.1'//rxjava
package com.test.rxbus;
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.subjects.Subject;
/**
* Created by Admin on 2017/5/19.
*
* RxBus 实现消息传递机制
*
* 需要引入RxJava1.x相关依赖
*
* //rxjava
* compile 'io.reactivex:rxjava:1.2.7'//rx对Android的支持
* compile 'io.reactivex:rxandroid:1.2.1'//rxjava
*
*/
public class RxBus {
private final Subject bus;
private Subscription mSubscription;
private RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
/**
* 单例模式RxBus
*
* @return
*/
private static class RxBusHolder {
private static final RxBus instance = new RxBus();
}
public static synchronized RxBus getInstance() {
return RxBusHolder.instance;
}
/**
* 接收消息
*
* @param eventType
* @param
* @return
*/
private Observable toObserverable(Class eventType) {
return bus.ofType(eventType);
}
public interface CallBack{
void onCallBack(Object obj);
}
/**
* 发送消息,外部调用
*
* @param data
*/
public void post(RxData data) {
bus.onNext(data);
}
/***
* 接收消息,外部调用(一般放在setListener中,类似button监听的用法)
*/
public void register(final CallBack callBack){
mSubscription = RxBus.getInstance().toObserverable(RxData.class)
//在io线程进行订阅,可以执行一些耗时操作
.subscribeOn(Schedulers.io())
//在主线程进行观察,可做UI更新操作
.observeOn(AndroidSchedulers.mainThread())
//观察的对象
.subscribe(new Action1() {
@Override
public void call(RxData data) {
if(callBack!=null){
callBack.onCallBack(data);
}
}
});
}
/***
* 注销,外部调用
*/
public void unRegister(){
if(mSubscription!=null&&!mSubscription.isUnsubscribed()){
mSubscription.unsubscribe();
}
}
}
package com.test.rxbus;
import java.io.Serializable;
/**
* Created by Admin on 2017/5/19.
*/
public class RxData implements Serializable{
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
首先activity实现 RxBus的CallBack接口,类似如下:
public class MainActivity extends BaseActivity implements MainContract.View,View.OnClickListener,RxBus.CallBack{
@Override
protected void setListener() {
mBtnFinger.setOnClickListener(this);
//注册Rxbus
RxBus.getInstance().register(this);
}
现在看看activity中数据是怎么发出和接收的,首先看发出代码,此处以点击按钮发送数据为例:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.finger:
RxData data=new RxData();
data.setCode(0x1);
data.setMessage("接收消息了");
data.setData("可以了吗");
RxBus.getInstance().post(data);
LogUtil.e("====fashe====");
break;
default:
break;
}
}
@Override
public void onCallBack(Object obj) {
int code= ((RxData)obj).getCode();
String message= ((RxData)obj).getMessage();
String data= ((RxData)obj).getData().toString();
LogUtil.e("====code===="+code);
LogUtil.e("====message===="+message);
LogUtil.e("====data===="+data);
}
@Override
protected void onDestroy() {
//注销Rxbus
RxBus.getInstance().unRegister();
super.onDestroy();
}
05-19 13:10:01.420 7983-7983/com.test E/pei: ====fashe====
05-19 13:10:01.421 7983-7983/com.test E/pei: ====code====1
05-19 13:10:01.421 7983-7983/com.test E/pei: ====message====接收消息了
05-19 13:10:01.421 7983-7983/com.test E/pei: ====data====可以了吗
Ok,关于 BxBus 在RxJava1.x 上的运用今天就讲到这里,谢谢诶。