RxBus在rxjava2.0 的使用
来源:互联网 发布:laravel nginx 编辑:程序博客网 时间:2024/04/30 22:28
今天自己刚好要写一个例子,本来想要用evenbus,但是想到自己用的是rxjava,在用evenbus就比较不和了吧! 所以就自己写了个rxbus
1. 首先是gradle的配置
compile 'io.reactivex.rxjava2:rxjava:2.0.8'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.jakewharton.rxrelay2:rxrelay:2.0.0'//出现异常也不会终止订阅关系 不使用第一个rxbus的写法的话,可以不需要这个
2.RxBus的写法
1. 在订阅者处理事件出现异常后,订阅者无法再收到事件,这是 RxJava 当初本身的设计原则,但是在事件总线中这反而是个问题,不过
JakeWharton 大神写了即使出现异常也不会终止订阅关系的 RxRelay,所以基于 RxRelay 就能写出有异常处理能力的 Rxbus。
import com.jakewharton.rxrelay2.PublishRelay;import com.jakewharton.rxrelay2.Relay;import io.reactivex.Observable;/** * 有异常处理的 Rxbus * Created by huxh on 2017/4/10. */public class RxBus { private static volatile RxBus instance; private final Relay<Object> mBus; public RxBus() { this.mBus = PublishRelay.create().toSerialized(); } public static RxBus getDefault() { if (instance == null) { synchronized (RxBus.class) { if (instance == null) { instance = Holder.BUS; } } } return instance; } public void post(Object obj) { mBus.accept(obj); } public <T> Observable<T> toObservable(Class<T> tClass) { return mBus.ofType(tClass); } public Observable<Object> toObservable() { return mBus; } public boolean hasObservers() { return mBus.hasObservers(); } private static class Holder { private static final RxBus BUS = new RxBus(); }}2.没有背压处理(Backpressure)的 Rxbus
import io.reactivex.Observable;import io.reactivex.subjects.PublishSubject;import io.reactivex.subjects.Subject;public class RxBus { private final Subject<Object> mBus; private RxBus() { // toSerialized method made bus thread safe mBus = PublishSubject.create().toSerialized(); } public static RxBus get() { return Holder.BUS; } public void post(Object obj) { mBus.onNext(obj); } public <T> Observable<T> toObservable(Class<T> tClass) { return mBus.ofType(tClass); } public Observable<Object> toObservable() { return mBus; } public boolean hasObservers() { return mBus.hasObservers(); } private static class Holder { private static final RxBus BUS = new RxBus(); }}
3.有背压处理的 RxBus
import io.reactivex.Flowable;import io.reactivex.processors.FlowableProcessor;import io.reactivex.processors.PublishProcessor;public class RxBus { private final FlowableProcessor<Object> mBus; private RxBus() { // toSerialized method made bus thread safe mBus = PublishProcessor.create().toSerialized(); } public static RxBus get() { return Holder.BUS; } public void post(Object obj) { mBus.onNext(obj); } public <T> Flowable<T> toFlowable(Class<T> tClass) { return mBus.ofType(tClass); } public Flowable<Object> toFlowable() { return mBus; } public boolean hasSubscribers() { return mBus.hasSubscribers(); } private static class Holder { private static final RxBus BUS = new RxBus(); }}
有些朋友不知道有背压与没有背压是什么意识,可以参考 http://flyou.ren/2017/04/05/关于RxJava背压/讲的很详细
好了,到了如何使用rxbus了,其实很简单
比如A跳转到B ,我这边是recycleview 的item点击跳转,传一个对象
@Override public void onItemClick(View view, int position) { ActicleBean.OthersBean bean = mDataList.get(position); RxBus.getDefault().post(bean); startActivity(new Intent(ArticleActivity.this,ActicleListActivity.class)); }
在B类上 直接写就可以获得了你所需要传的对象
import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.frame.huxh.mvpdemo.R;import com.frame.huxh.mvpdemo.bean.ActicleBean;import com.frame.huxh.mvpdemo.rxbus.RxBus;import com.frame.huxh.mvpdemo.utils.ToastUtils;import io.reactivex.annotations.NonNull;import io.reactivex.functions.Consumer;import io.reactivex.functions.Function;public class ActicleListActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_acticle_list); operateBus(); } /** * RxBus */ private void operateBus() { RxBus.getDefault().toObservable() .map(new Function<Object, ActicleBean.OthersBean>() { @Override public ActicleBean.OthersBean apply(@NonNull Object o) throws Exception { return (ActicleBean.OthersBean) o; } }) .subscribe(new Consumer<ActicleBean.OthersBean>() { @Override public void accept(@NonNull ActicleBean.OthersBean othersBean) throws Exception { if (othersBean != null) { ToastUtils.toast(ActicleListActivity.this, "othersBean" + othersBean.getDescription()); } } }); }}
0 0
- RxBus在rxjava2.0 的使用
- RxBus的使用(基于RxJava2.0)
- 基于Rxjava2的事件总线:Rxbus
- 基于Rxjava2的事件总线:Rxbus
- RxBus基于Rxjava2.0---支持Sticky事件
- RxJava1.0的RxBus使用
- RxJava2.0的使用
- Rxjava2使用-构建事件总线(RxBus)代替原生广播
- 基于RxJava2的RxBus,打造属于你自己的EventBus
- RxJava+RxBus的使用
- RXBUS的简单使用
- RxBus的使用示例
- Android Rxbus的使用
- Rxbus的简单使用
- Android RxBus的使用
- 【笔记】RxJava2.0新特性简单介绍并实现RxBus
- RxJava2.0的使用-1
- RxJava2.0的使用-2
- Service
- Xvid编解码色彩失真(偏色)问题及其解决
- 从零开始用 Flask 搭建一个网站(一)
- SQL实现定时执行计划(---SQL Server2012)
- 数据存储单位从B/KB/MB/GB到NB/DB,如何转化?全球数据量有多少
- RxBus在rxjava2.0 的使用
- EditText实现分割输入内容
- ReactNative开发中如何去掉iOS状态栏的"Loading from..."
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- LeetCode 21. Merge Two Sorted Lists
- Wkhtmltopdf的安装与使用
- 好雨云帮开发者大赛第二期:「Beego」
- [解决] tomcat 8.5 gzip不生效
- Android bindService (7.1) sequence flow