RxBus初探

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

首先说一下RxBus是什么?

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

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'

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

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

    private final Map<Class<?>, 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 <T> Observable<T> toObservable(final 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 ObservableOnSubscribe<T>() {
                    @Override
                    public void subscribe(ObservableEmitter<T> subscriber) throws Exception {
                        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();
        }
    }


    /**
     * 普通订阅解绑
     * @param disposable
     */
    public static   void  rxBusUnbund(CompositeDisposable disposable){
        if (null != disposable && !disposable.isDisposed()) {
            disposable.clear();
        }
    }

}

3.第3步———添加一个事件发送类

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

布局代码:

layout_send.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转"
        android:textColor="@color/colorAccent"
        android:textSize="14sp"
        android:layout_gravity="center"/>
</LinearLayout>

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

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

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

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

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值