Day4-1 rxjava


参考简书:https://www.jianshu.com/p/a406b94f3188
https://www.jianshu.com/p/cd984dd5aae8
c

1.案例引入理解观察者模式

运钞车负责运送纸币,警车负责保护运钞车,但是有一批强盗伺机截获运钞车,当车出动的时候,强盗抢钱,警察保护钱

2.原理分析

  • Rxjava原理 基于 一种扩展的观察者模式
  • Rxjava的扩展观察者模式中有4个角色:
角色作用类比
被观察者(Observable)产生事件运钞车
观察者(Observer)接收事件,并给出响应动作强盗+警察
订阅(Subscribe)连接 被观察者 & 观察者观察等待
事件(Event)被观察者 & 观察者 沟通的载体运钞车出动

二.基本使用

0.添加依赖:

   //RxJava依赖:主要用于消息传递
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

1.简单实现

步骤1:创建被观察者 (Observable )& 生产事件
步骤2:创建观察者 (Observer )并 定义响应事件的行为
步骤3:通过订阅(Subscribe)连接观察者和被观察者

 //1 创建被观察者.
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext("1");
                emitter.onError(new RuntimeException("大丰收的"));
                emitter.onNext("2");
                emitter.onComplete();
            }
        });
        
        //2 观察者
        Observer observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i(TAG, "onSubscribe: ");
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, "onNext: "+s);
            }

            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "onError: ");
            }

            @Override
            public void onComplete() {
                Log.i(TAG, "onComplete: ");
            }
        };

        //3 绑定
        observable.subscribe(observer);

三.线程切换

  • 在 RxJava 的默认规则中,事件的发出和消费都是在同一个线程(主线程),这显然不是我们要的。
  • 因为我们希望:
    • 被观察者 (Observable) 在 子线程 中生产事件(如实现耗时操作/IO操作/网络请求等等)。
    • 观察者(Observer)在 主线程 中接收事件(即实现UI操作)。
  • 为了解决上述冲突,即实现 真正的异步操作,我们需要对RxJava进行 线程控制(也称为调度 / 切换)。
  • 我们在后面讲解retrofit+rxjava+rxandroid结合在一起进行网络请求的时候就会深有体会----------
Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext("1");
                emitter.onNext("2");
            }
        })
                .subscribeOn(Schedulers.io())//一般被观察者进行网络请求
                .observeOn(AndroidSchedulers.mainThread())//观察者主线程中进行UI刷新
                .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, "onNext: "+s);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

四.常用操作符

1.create(): 通过函数从头开始创建一个Observable:上面的案例就是用的这个

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                //isDisposed() 是否有订阅关系
                if (!emitter.isDisposed()) {
                    emitter.onNext("1");
                    emitter.onNext("2");
                    emitter.onNext("3");
                    emitter.onComplete();
                    emitter.onNext("4");
                }
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("GAO", "onNext--" + s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        Log.e("GAO", "onComplete");
                    }
                });

2.just() :将对象转换为发出该对象的Observable,自己打印查看结果

Observable.just("你好", "RxJava").subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("GAO", "onNext--" + s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        Log.e("GAO", "onComplete");
                    }
                });

3.merge() — 将多个Observable组合成一个

Observable.merge(Observable.just("你好", "RxJava"), Observable.just("你好2", "RxJava2")).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {
                        Log.e("GAO", "onNext--" + s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        Log.e("GAO", "onComplete");
                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值