RXBUS

简单的实现一下RXBUS的思想

在我的理解里面,RXBUS可以理解为就像乘公交车一样,上车然后到达目的地下车。在代码里面可以理解为发送一个被观察者到集合然后根据类型来决定是否订阅。和公交的上车下车目的几乎一致(不 是一致)。
如果不熟悉RXJAVA的同学请到这里来了解

给 Android 开发者的 RxJava 详解

一·创建一个RXJAVA 只需要几步

创建订阅者

mSubscriber = new Subscriber<String>() {
            @Override
            public void onStart() {
                super.onStart();
                showtext="";
                showtext+="开始了";
            }

            @Override
            public void onCompleted() {
                showtext+="成功233333";
                mShowrxtext.setText(showtext);
            }

            @Override
            public void onError(Throwable e) {
                    showtext+="失败23333";
            }

            @Override
            public void onNext(String s) {
                    showtext+=s;
            }
        };

创建被观察者

        mObservable = Observable.create(new Observable.OnSubscribe<String>(){
        @Override
        public void call(Subscriber<? super String> subscriber) {
            mObserver.onNext("hello ");
            mObserver.onNext("world");
            mObserver.onNext("!!!!!");
            mObserver.onCompleted();
        }
    });

然后订阅者订阅被观察者

mObservable.subscribe(mObserver)

这样就完成了一个最简单的RXJAVA程序

二·实现RXBUS

public class RxBus {
    private static volatile RxBus defaultInstance;

    private final Subject<Object, Object> bus;
    // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
    public RxBus() {
      bus = new SerializedSubject<>(PublishSubject.create());
    }
    // 单例RxBus
    public static RxBus getDefault() {
        if (defaultInstance == null) {
            synchronized (RxBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new RxBus();
                }
            }
        }
        return defaultInstance ;
    }
    // 发送一个新的事件
    public void post (Object o) {
        bus.onNext(o);
    }
    // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
    public <T> Observable<T> toObservable (Class<T> eventType) {
        return bus.ofType(eventType);
    }
}

最简单的RXBUS实现

Subject有4个类型

PublishSubject
BehaviorSubject
ReplaySubject
AsyncSubject

PublishSubject的含义是:在订阅者订阅的时间点之后的数据发送给观察者

SerializedSubject

SerializedSubject extends Subject extends Observable implements Observer,既是观察内容,又是观察者,起到桥梁/数据转发的作用

注:

1、Subject同时充当了Observer和Observable的角色,Subject是非线程安全的,要避免该问题,需要将 Subject转换为一个 SerializedSubject ,上述RxBus类中把线程非安全的PublishSubject包装成线程安全的Subject。

2.CompositeSubscription
该对象作为subscription的容器,方便统一取消订阅

关于Subject

然后实现以下RXBUS基本操作

public class newRxJavaSix extends AppCompatActivity{
    private int i = 0;
    private List<Activity> mList = new ArrayList<>();
    private CompositeSubscription allSubscription = new CompositeSubscription();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wu_2016_10_12_b_rxsix);
        onRxBus();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Arrays.asList("Alice", "Bob", "Charlie", "Dave").forEach(System.out::println);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mList.forEach(newRxJavaSix::sayHello);
        }



    }

    public void ClickRxBus(View v){
        i++;
        RxBusDemo.getInstance().send(i);
    }

//    :: 语法 s引用某个方法
    private void onRxBus(){
        final int[] array = new int[2];
        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                Logger.d("error"+e.toString());
                i = 0;
//                onRxBus();
//                newRxJavaSix.this.onRxBus();

            }

            @Override
            public void onNext(Integer integer) {
                array[integer] = integer;
                Logger.d("on next"+integer);
            }
        };



        allSubscription.add(RxBusDemo.getInstance().toSubscription(Integer.class, subscriber));
    }



    private static void sayHello(Activity str) {
        System.out.println("hello");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (allSubscription != null && !allSubscription.isUnsubscribed())
            allSubscription.unsubscribe();

        System.out.print(Constant.BASE);
    }
}

注:发生错误的时候会取消订阅的,所以可以在onError里面处理出现错误的情况,可以重新订阅。还有记得在onDestory里面需要取消订阅 避免内存泄露

参考RxBus学习之旅--从入门到提高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值