• Android Rxjava架构原理与使用的详解解答


    简单介绍

    Rxjava这个名字,其中java代表java语言,而Rx是什么意思呢?Rx是Reactive Extensions的简写,翻译过来就是,响应式拓展。所以Rxjava的名字的含义就是,对java语言的拓展,让其可以实现对数据的响应式编程。

    原理

    Rx是Reactive Extensions的缩写的简写,可以使用可观察数据流对编程接口进行异步编程,它结合了观察者模式,迭代器模式和函数式的精华。

    Rxjava是一种异步数据处理库,也是一种观察者模式。最早是Netflix公司用于重构当前架构时减少REST调用的次数,参考了Microsoft公司的响应式编程,把Microsoft的Rx库迁移到Java JVM中,其中最有名的就是RxJava。

    它的特点主要有以下:

    • 支持Java 8 Lambda。
    • 支持异步和同步。
    • 单一依赖关系。
    • 简洁,优雅。

    RxAndroid

    在开发项目的时候,开发者在使用Rxjava时会搭配RxAndroid,他是针对Rxjava在Android平台使用的一个响应式扩展组件。使用RxAndroid的Schedulers(调度器)可以解决Android主线程问题, 多线程等问题。

    操作符

    其实RxJava中最重要的操作符,它可以在订阅的过程中进行各种转化,下面以Map操作符为例子来进行说明,Map操作符本身就是一个映射的关系

            mText.append("\n 输入参数: 1,2,3,4,5,6 \n");
            Observable.from(number)           //之前提到的创建Observable方法
                      .map(new Func1() {
                          @Override
                          public Boolean call(Integer integer) {
                              mText.append("\n\n map()  Integer--->Boolean");
                              return (integer<3);
                          }
                      })
                      .subscribe(new Action1() {
                        @Override
                        public void call(Boolean aBoolean) {
                            mText.append("\n观察到输出结果:\n");
                            mText.append(aBoolean.toString());
     
                        }
                    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里的Map进行了类型的转换,将int转变成嗯boolean类型的

    操作符原理

    • (1)首先创建一个代理的观察者
    • (2)让外部的Obervable去订阅这个代理的观察者
    • (3)外部的观察者发送onNext等事件,都会先传递到代理观察者这里
    • (4)在代理观察者的onNext中调用自己创建的Fun1的call方法,进行数据的转化
    • (5)当我们在调用obervable的call方法的时候会将真实的观察者传递进来
    • (6)调用真实观察者的onNext方法将结果传递出去就可以了

    线程调度操作符

    这个是异步的关键,用来在主线程和子线程之间进行切换

            Observable.create(new Observable.OnSubscribe(){
     
                @Override
                public void call(Subscriber subscriber) {
                    sb.append(" Observable.create(): 线程: "+Thread.currentThread().getName()+"\n\n");
                    Drawable dd=getResources().getDrawable(R.mipmap.gril);
                    subscriber.onNext(dd);
                    subscriber.onCompleted();
                }
            }).subscribeOn(Schedulers.io())
              .observeOn(Schedulers.newThread())
              .map(new Func1() {
                  @Override
                  public ImageView call(Drawable drawable) {
                      sb.append("map():  drawable -->imageview 的线程: "+Thread.currentThread().getName()+"\n\n");
                      ImageView img=new ImageView(RxSchuderActivity.this);
                      LinearLayout.LayoutParams params= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                      img.setLayoutParams(params);
                      img.setImageDrawable(drawable);
                      return img;
                  }
              }).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1() {
                    @Override
                    public void call(ImageView imageView) {
                        sb.append("call(): 线程: "+Thread.currentThread().getName()+"\n");
                        mText.setText(sb);
                        mLinearlayout.addView(imageView);
     
                    }
                });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    实际上线程调度只有subscribeOn()和observeOn()两个方法。对于初学者,只需要掌握两点:

    subscribeOn()它指示Observable在一个指定的调度器上创建(只作用于被观察者创建阶段)。只能指定一次,如果指定多次则以第一次为准

    observeOn()指定在事件传递(加工变换)和最终被处理(观察者)的发生在哪一个调度器。可指定多次,每次指定完都在下一步生效。

    线程调度掌握到这个程度,在入门阶段时绝对够用的了。

    Rxjava基本使用

    上面这段代码是对Rxjava简单的使用,其中

    • Single 发出单个数据的被观察者Observable,只发送一次,只有Success和Error两种状态,没有next,在Rxjava2中新增
    • just 被观察者生产的数据,参数类型是一个泛型,这里传进去的是一个String
    • subscribe 观察者Observer,这里声明的是SingleObserver,用来对Single中产生的数据进行响应
    • SingleObserver
    • onSubscribe 订阅成功后就会回调,一般会在此方法中进行一些初始化操作。其参数类型是Disposable,可以通过调用d.dispose() 取消对Observable的监听,并让其停止发送消息。
    • onSuccess 接收数据成功后就会回调,只会回调一次,其参数类型和Observable中just方法传入的数据类型一致,这里是String类型
    • onError 发生错误时回调,参数是Throwable,包含错误信息。

    运行效果

    2022-12-18 13:54:12.450 29223-29223/com.hfhuaizhi.rxjavatest E/hftest: onSubscribe 
    2022-12-18 13:54:12.451 29223-29223/com.hfhuaizhi.rxjavatest E/hftest: onSuccess:hfhuaizhi
    
    • 1
    • 2

    可以看到首先onSubscribe被调用,表明注册了观察者。然后接收数据成功,打印出’hfhuaizhi’。 到这里我们就了解了Rxjava最基本的用法,接下来分析一下函数的内部做了什么。有关Android的架构技术进阶可以参考《Android核心技术笔记》点击就可以查看到详细的板块了。

  • 相关阅读:
    The main method caused an error
    基于springboot红色吕梁网站毕业设计源码150923
    堆排序详解
    各种ide配置gitignore的模版文件内容
    第1讲:MyBatis简介与入门
    【CSS3】CSS3 3D 转换 ① ( CSS3 3D 转换简介 | 3D 物体与 2D 物体区别 | 3D 空间坐标系 | 常用的 3D 转换属性 | 3D 位移转换语法 | 代码示例 )
    权限提升WIN篇(腾讯云,CS,MSF)
    Python使用virtualenvwrapper模块创建虚拟环境
    php案例:今天是星期几呢?
    信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果
  • 原文地址:https://blog.csdn.net/m0_70748845/article/details/134384310