RxBus 基于 RxJava1.x 实现消息传递机制

来源:互联网 发布:台湾中华电信网络制式 编辑:程序博客网 时间:2024/05/19 17:49

这节我们继续讲述 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

然后创建一个RxBus的消息机制调用类,代码如下:

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 <T>     * @return     */    private <T> Observable<T> toObserverable(Class<T> 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<RxData>() {                    @Override                    public void call(RxData data) {                       if(callBack!=null){                           callBack.onCallBack(data);                       }                    }                });    }    /***     * 注销,外部调用     */    public void unRegister(){        if(mSubscription!=null&&!mSubscription.isUnsubscribed()){            mSubscription.unsubscribe();        }    }}

其中涉及到一个消息传递的载体RxData,它是一个model,代码如下:

package com.test.rxbus;import java.io.Serializable;/** * Created by Admin on 2017/5/19. */public class RxData<T> 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中怎么调用:


首先activity实现 RxBus的CallBack接口,类似如下:

public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View,View.OnClickListener,RxBus.CallBack{

然后在 setListener方法中注册RxBus,代码如下:

    @Override    protected void setListener() {        mBtnFinger.setOnClickListener(this);        //注册Rxbus        RxBus.getInstance().register(this);    }

由于activity实现了RxBus.CallBack接口,于是便会自动生成 onCallBack(RxData data) 方法用于接收数据。

现在看看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;        }    }

再看看activity中接收数据的代码:

    @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);    }

当然,在执行完毕后,别忘了在activity的ondestroy中注销:

    @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====105-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 上的运用今天就讲到这里,谢谢诶。





原创粉丝点击