IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> RxJava原理学习 -> 正文阅读

[移动开发]RxJava原理学习

前言

本文为个人学习RxJava框架时所作,参考了两篇大佬的文章,在文末给出了链接。我只是在这里做一个两方面的整合,方便个人学习。

总结

RxJava是一个响应式编程框架,可以非常方便的实现线程调度以及数据转换,规范代码,并且其用到了观察者模式和装饰者模式。与Retrofit框架配合较多。

1.RxJava是什么?

响应式编程框架,响应式编程是一种通过异步和数据流来构建事务关系的编程模型。能够由事件来驱动事务
RxJava利用响应式编程的优点,可以实现
①可以通过一系列链式调用,规范代码
②能够通过subscribeOnobserveOn两个方法实现线程切换,通过Map,FlatMap等操作符实现中间事件的转换。
③与Retrofit框架配合使用较多

2.RxJava的线程调度

线程调度只有subscribeOn()observeOn()两个方法。
subscribeOn()它指示Observable在一个指定的调度器上创建(只作用于被观察者创建阶段)。只能指定一次,如果指定多次则以第一次为准
observeOn()指定在事件传递(加工变换)和最终被处理(观察者)的发生在哪一个调度器。可指定多次,每次指定完都在下一步生效。

RxJava的线程环境有哪些选项:
在这里插入图片描述

3.RxJava的操作符

常用的是Map和FlatMap。

①关于Map的使用例子
  Observable.just(getFilePath())
            //使用map操作来完成类型转换
            .map(new Func1<String, Bitmap>() {
              @Override
              public Bitmap call(String s) {
                //显然自定义的createBitmapFromPath(s)方法,是一个极其耗时的操作
                  return createBitmapFromPath(s);
              }
          })
          .subscribe(
               //创建观察者,作为事件传递的终点处理事件    
                new Subscriber<Bitmap>() {
                      @Override
                      public void onCompleted() {
                          Log.d("DDDDDD","结束观察...\n");
                      }

                      @Override
                      public void onError(Throwable e) {
                          //出现错误会调用这个方法
                      }
                      @Override
                      public void onNext(Bitmap s) {
                          //处理事件
                          showBitmap(s)
                      }
                  );
②关于FlatMap的例子

需求:查找一个学校每个班级的每个学生,并打印出来。

//创建被观察者,获取所有班级
 Observable.from(getSchoolClasses())
                .flatMap(new Func1<SingleClass, Observable<Student>>() {
                    @Override
                    public Observable<Student> call(SingleClass singleClass) {
                        //将每个班级的所有学生作为一列表包装成一列Observable<Student>,将学生一个一个传递出去
                        return Observable.from(singleClass.getStudents());
                    }
                })
                .subscribe(
                //创建观察者,作为事件传递的终点处理事件    
                  new Subscriber<Student>() {
                        @Override
                        public void onCompleted() {
                            Log.d("DDDDDD","结束观察...\n");
                        }

                        @Override
                        public void onError(Throwable e) {
                            //出现错误会调用这个方法
                        }
                        @Override
                        public void onNext(Student student) {
                            //接受到每个学生类
                            Log.d("DDDDDD",student.getName())
                        }
                    );

解释:FlatMap可以再次包装新的Observable,而每个Observable都可以使用from(T[])方法来创建自己,这个方法接受一个列表,然后将列表中的数据包装成一系列事件。
在这里就是,singleClass.getStudents()返回Student集合,然后Observable.from(这个Student集合),可以依次将Student集合中的每一个元素Student包装成Observable返回,并传递下去

4.RxJava的观察者模式

4.1 用到的类的介绍

RxJava的观察者模式是扩展的观察者模式,一个被观察者对应一个观察者。涉及的类有

Observable:被观察者
Observer:观察者
Event:被观察者通知观察者的事件
Subscribe:订阅

其中事件有

Next:常规事件,可以传递各种各样的数据;
Complete:结束事件,当观察者接收到结束事件后,就不会再接收后续被观察者发送来的事件;
Error:异常事件,当被观察者发送异常事件后,那么其他的事件就不会再继续发送了;

4.2 原理

有一个泛型类,包装了Observer,即CreateEmitter类。在Observable调用subscribe传入Observer的时候,会首先把ObserverCreateEmitter包裹起来,然后当有事件发生的时候,通过这个包裹了Observer的发射器CreateEmitter发射事件,最终调用到Observer里面的相应方法。
同时注意,在RxJava里面是被观察者订阅观察者。但背后还是观察者订阅的被观察者,之所以写的时候是相反的,是为了保持流失API的调用风格,以Observable为主体,一气呵成。

CreateEmitter代码如下

public class CreateEmitter<T> implements Emitter<T> {

    final Observer<T> observer;

    CreateEmitter(Observer<T> observer) {
        this.observer = observer;
    }

    @Override
    public void onNext(T t) {
        observer.onNext(t);
    }

    @Override
    public void onError(Throwable error) {
        observer.onError(error);
    }

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

Observable实现如下

public abstract class Observable<T> {
    
    // 实现订阅的逻辑
    public void subscribe(Observer<T> observer){
    	// 通过将传进来的observer包装成CreateEmitter,用于回调
        CreateEmitter<T> emitter = new CreateEmitter<T>(observer);
        // 回调订阅成功的方法
        observer.onSubscribe(emitter);
		
        // 回调发射器emitter
        subscribe(emitter);
    }

	// 订阅成功后,进行回调
    public abstract void subscribe(Emitter<T> emitter);

}

然后在observer方法中这样调用

private void observer() {
    // 第一步,创建被观察者
    Observable<String> observable = new Observable<String>() {
            @Override
            public void subscribe(Emitter<String> emitter) {
                emitter.onNext("第一次");

                emitter.onNext("第二次");

                emitter.onNext("第三次");

                emitter.onComplete();
            }
        };

    // 第二步,创建观察者
    Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Emitter emitter) {
                Log.i("TAG", " onSubscribe ");
            }

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

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

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

    // 第三步,被观察者订阅观察者
    observable.subscribe(observer);
}

5.RxJava的装饰者模式

我们在创建被被观察者的时候,会对被观察者做一层包装, 创建几次就包装几次,然后在被观察者调用subscribe方法时,一层层回调被观察者的subscribeActual方法,而在被观察者的subscribeActual方法里,会对观察者做一层包装;
也就是说被观察者是在创建的时候进行包装,然后在subscribeActual方法里实现额外的功能;
而观察者是在被观察者调用subscribeActual方法里进行包装的,然后针对观察者实现自己额外的功能;

流程图是这样的
在这里插入图片描述

6.参考文章

这是RxJava入门学习的文章推荐,这是对RxJava设计模式以及源码介绍的文章推荐。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:29:59  更:2022-05-05 11:35:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:34:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码