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

这节我们继续讲述 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====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 上的运用今天就讲到这里,谢谢诶。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值