RxBus初探

使用Rxjava有一段时间了,最近发现Rxbus和Rxjava配合使用体验很好,于是记录一下

首先说一下RxBus是什么?

一句话概括:用注册订阅者模式实现的通讯方式。
简简单单的一个 观察者observable 与 Subscriber。RxBus并不是一个库,而是一种模式,用过EventBus的都知道采用了观察者模式。如果我们在使用Rxjava了,并且减少库的依赖,那么我们可以用RxBus去代替EventBus。
 

RxBus初探_第1张图片

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'

RxBus初探_第2张图片

2.第二步————新建RxBus基类:

RxBus初探_第3张图片

/**
 * @作者: njb
 * @时间: 2019/8/28 17:59
 * @描述:
 */
public class RxBus {
    private volatile static RxBus mDefaultInstance;
    private final Subject mBus;

    private final Map, 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  Observable toObservable(final Class 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  Observable toObservableSticky(final Class eventType) {
        synchronized (mStickyEventMap) {
            Observable observable = mBus.ofType(eventType);
            final Object event = mStickyEventMap.get(eventType);

            if (event != null) {
                return observable.mergeWith(Observable.create(new ObservableOnSubscribe() {
                    @Override
                    public void subscribe(ObservableEmitter subscriber) throws Exception {
                        subscriber.onNext(eventType.cast(event));
                    }
                }));
            } else {
                return observable;
            }
        }
    }

    /**
     * 根据eventType获取Sticky事件
     */
    public  T getStickyEvent(Class eventType) {
        synchronized (mStickyEventMap) {
            return eventType.cast(mStickyEventMap.get(eventType));
        }
    }

    /**
     * 移除指定eventType的Sticky事件
     */
    public  T removeStickyEvent(Class 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步———添加一个事件发送类

RxBus初探_第4张图片

/**
 * @作者: 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();
            }
        });
    }
}

RxBus初探_第5张图片

布局代码:

layout_send.xml




    

5.第五步————接收事件

RxBus初探_第6张图片

private void initRxBus() {
    compositeDisposable = new CompositeDisposable();
    RxBus.getInstance().toObservable(WeatherEvent.class)
            .subscribe(new Observer() {
                @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基类封装的取消订阅方法,所以直接调用

RxBus初探_第7张图片

@Override
protected void onDestroy() {
    super.onDestroy();
    //取消订阅
    RxBus.rxBusUnbund(compositeDisposable);
}

7.测试一下按钮添加传递数据:日志打印数据

RxBus初探_第8张图片

以上就是RxBus的简单使用流程,大家可根据项目自行选择使用EventBus还是RxBus,亦或是其他的,没有规定说一定要用那个,那个合适用那个,那个好用选那个,生命不止,学习不止,有问题希望大家指出改进.

 

你可能感兴趣的:(开发实例)