Rxjava

2021-11-15  本文已影响0人  啪嚓啪嚓

Rxjava学习笔记

前言:rxjava是近几年来比较火的一个框架,是一个基于事件流的一个链式框架,可以很方便的进行线程切换,使用各种不同的简单的操作符将以前传统复杂的代码逻辑简单化,可能这么说比较笼统,举几个例子:

1.用户需要先注册账号,注册成功之后,需要做登录操作
2.app首页的数据列表需要两个甚至多个接口的数据一起返回,需要将数据合并,再展示给用户
3.网络请求失败之后,需要重新发起请求
有工作经验的同学都知道这种需求实现起来并不复杂,但是代码体现上要不就是嵌套过多,要不就是需要一大堆的逻辑控制代码,不太美观,但是使用rxjava的链式调用以及操作符(比如concat)就很简单了,并且比较美观

rxjava的学习曲线比较陡峭,一直想学习提升一下b格,无奈太懒,闲来无事看了看菜鸟窝的免费课程,学习了下,这里主要记录一下用法以及操作符,加深一下印象

注意:此笔记使用的版本为 rxjava3.x

Observable,subscribe,Observer

这三者为rxjava的基础,框架使用的是观察者模式,既然是观察者模式,那就存在订阅(subscribe)关系,逻辑上是“订阅者”订阅“被订阅者”,但在rxjava的代码体现上为“被订阅者”订阅“订阅者”。

Observable:被观察者,被订阅者
Observer:观察者,订阅者
subscribe:订阅

1.Observable

既然是被观察者订阅观察者,先说被观察者,被观察者的创建有很多种方式,常用的如下:

Observable observable = ObservableAll.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
            }
});

被观察者为事件的发出方,rxjava中所有的事件操作符api调用之后,都会生成一个Observable对象;
注:操作符是用来定义事件发出的规律,规则,但是不论规则是怎么样的,最终都会生成一个Observable对象(个人理解,有问题的话请指正)

2.subscribe

subscribe即为订阅的动作,代码体现为:

//getObserver()只是一个获取observer的方法,下面有说
observeble.subscribe(getObserver());

3.Observer

Observer为事件的观察者,即事件最终会通知到“观察者”,观察者的体现形式比较多:

//这里的String为事件最终通知的数据类型,可以为基本数据类型也可以为包装数据类型,bean类
new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {}

            @Override
            public void onNext(@NonNull String o) {}

            @Override
            public void onError(@NonNull Throwable e) {}

            @Override
            public void onComplete() {}
        };

以上这些东西合起来就组成了一个订阅关系,代码如下:

ObservableAll.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                           //emitter.onNext("1"); 该方法调用之后,对应的Observer的onNext会回调
                           //emitter.onNext("2");
                           //emitter.onComplete();该方法调用之后,对应的Observer的onComplete会回调
                           //如果发生异常,会调用Observer的onError方法;
         }
        }) .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) { }

                    @Override
                    public void onNext(@NonNull String s) {}

                    @Override
                    public void onError(@NonNull Throwable e) {}

                    @Override
                    public void onComplete() {}
                });

当然,这是rxjava的最基本使用

4.操作符

操作符是rxjava中比较重要的一环,可以用来定义事件的发出规则,比如:

1).ObservableAll.just(1, 2, 3, 4):将参数1,2,3,4按顺序发出

2).ObservableAll.create() : 创建操作符,需要传入一个接口实现类,实现 subscribe 方法,该方法的参数emitter为事件的发射器,可以在此方法内定义数据源的操作或者使用发射器发射事件;个人认为该实现方式为最基础的创建Observable的方法,本身没有任何的规则或者规律;

ObservableAll.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                           //emitter.onNext("1"); 该方法调用之后,对应的Observer的onNext会回调
                           //emitter.onNext("2");
                           //emitter.onComplete();该方法调用之后,对应的Observer的onComplete会回调
                           //如果发生异常,会调用Observer的onError方法;
          }
        })

3).ObservableAll.fromarray(1, 2, 3, 4)

将参数1,2,3,4按顺序发出,作用同just操作符

4).ObservableAll.fromCallable()

需要传入一个接口实现类Callable,实现 call 方法

ObservableAll.fromCallable(new Callable<String>() {
            @Override
            public String call() throws Exception {
                //有点类似于create操作符,但是在call内无法主动控制onSubscribe,onNext,onComplete
                return "";
            }
        });

5).ObservableAll.interval(0, 1, TimeUnit.SECONDS)

以某一个时间为间隔重复执行,第一个参数为延时执行时间,第二个参数为间隔时间,第三个参数为“秒”,也可以传“分”“时”;

6).merge

作用如同字面意思,需要传入多个Observable对象作为事件源,然后将这些事件合并发出,注意:该操作符是无序的,不会按传入的参数顺序来

7).concat

作用同merge,但是为有序,按传入的参数顺序来;

8).map

注意,该操作符需要先有数据源之后,才可以调用,非static,以上几个操作符都是确定数据源,返回一个Observerble对象,而该操作符为对数据源进行变换操作,代码如下:

//map操作符,将源数据变换之后依次发出
        ObservableAll.just(1, 2, 3, 4, 5).map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Throwable {
                return integer.toString();
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Throwable {
                Log.e("MainActivity", "map-----------------" + s);
            }
        });

这里是做了将数据源转为String的变换,当然可以做别的操作;

9).filter

该操作符的使用条件同上,作用为过滤,代码如下:

        ObservableAll.just(1, 2, 3)
                //filter为过滤操作符,对源数据进行过滤
                .filter(new Predicate<Integer>() {
                    @Override
                    public boolean test(Integer integer) throws Throwable {
                        return integer >= 2;
                    }
                })

10).flatMap

将数据处理之后,返回一个Observebale<T>包装的数据

 ObservableAll.just(1, 2, 3, 4).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Integer integer) throws Throwable {
                return ObservableAll.just(integer + "");
            }
        });

暂时先写这么多,后续有用到的再补上

上一篇下一篇

猜你喜欢

热点阅读