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

news2024/11/21 2:27:57

简单介绍

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<Integer, Boolean>() {
                      @Override
                      public Boolean call(Integer integer) {
                          mText.append("\n\n map()  Integer--->Boolean");
                          return (integer<3);
                      }
                  })
                  .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean aBoolean) {
                        mText.append("\n观察到输出结果:\n");
                        mText.append(aBoolean.toString());
 
                    }
                });

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

操作符原理

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

线程调度操作符

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

        Observable.create(new Observable.OnSubscribe<Drawable>(){
 
            @Override
            public void call(Subscriber<? super Drawable> 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<Drawable, ImageView>() {
              @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<ImageView>() {
                @Override
                public void call(ImageView imageView) {
                    sb.append("call(): 线程: "+Thread.currentThread().getName()+"\n");
                    mText.setText(sb);
                    mLinearlayout.addView(imageView);
 
                }
            });

实际上线程调度只有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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1203803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python画折线图 一张图上三条折线 设置折线marker chatgpt画折线图的提示词

chatgpt提示词 用python写一段代码&#xff0c;该代码的功能是&#xff1a;画一个折线图&#xff0c;该折线图x轴的标题是面积&#xff0c;y轴的标题是房价。该图上有三条折线&#xff0c;分别代表深圳&#xff0c;广州&#xff0c;郑州。这三条折线的颜色分别为红&#xff0c…

allegro等跨境电商平台可以测评补单吗?

做allegro平台如果想要销量好&#xff0c;基本免不了要进行测评补单&#xff0c;因为不管对于哪一个平台的新店铺新产品而言&#xff0c;前期只靠自然流量是很难的&#xff0c;所以很多卖家都会选择测评来提高产品的排名&#xff0c;权重和销量&#xff0c;也可以提升订单量&am…

基于JavaWeb+SSM+基于微信小程序的“生鲜食品”团购平台生鲜商城系统的设计和实现

基于JavaWebSSM基于微信小程序的“生鲜食品”团购平台生鲜商城系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 生鲜食品是我们生活中的必需品&#xff0c;为了确保食品的新鲜…

贝锐向日葵如何实现无人值守远程控制?

1.适用场景 &#xff08;1&#xff09;远程公司电脑应急办公&#xff08;2&#xff09;远程家里电脑游戏挂机&#xff08;3&#xff09;异地远程传输文件 2.操作步骤 &#xff08;1&#xff09;电脑安装向日葵个人版并登录贝锐账号&#xff08;点击注册&#xff09;&#xf…

deepstream生成pipeline拓扑图的方法

deepstream生成pipeline拓扑图的方法 1、前期工作1.1 安装dot 2、使用命令行生成2.1、添加环境变量2.2 、运行管道2.3 、使用dot 生成png图片 3、在c中使用3.1、添加代码3.2、运行代码3.3 、使用dot 生成png图片 4、在python中使用4.1、添加代码4.2 、使用dot 生成png图片 1、前…

软件外包开发需求整理需要注意的问题

在整理软件开发需求时&#xff0c;注意以下问题可以有助于确保需求的准确性、完整性和可行性。通过认真考虑这些问题&#xff0c;您可以确保整理出一份清晰、全面且具有可行性的软件开发需求文档&#xff0c;有助于项目的成功实施。北京木奇移动技术有限公司&#xff0c;专业的…

Vue3 数据响应式原理:Proxy和Reflect

我们在Vue2中使用的是Object.defineProperty方法来实现数据响应式的&#xff0c;可以通过get和set方法来监听对象的访问和修改。 但是并不能响应对象中属性的增加和删除&#xff0c;只能使用Vue.$set 和Vue.$delete 来对对象中的属性进行增加和删除。 数组也不能直接通过下标…

es性能强悍的推演过程

前言 es底层复用的Lucene的能力&#xff0c;Lucene在以前的文章中有所讲解&#xff0c;感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

02-瑞吉外卖员工表的增删改查

添加员工信息 执行流程 第一步: 用户点击添加员工按钮跳转到add.html页面,然后在页面中输入要添加的员工的信息 第二步: 用户点击保存按钮发送Ajax请求将用户输入的员工信息以json的格式提交到服务端 第三步: 服务端Controller接收页面提交的json格式的数据并转化为java对象…

酷开系统 | 酷开科技:打造精彩纷呈的电影盛宴

对于许多人来说&#xff0c;观看电影是一种享受、一种放松、一种逃避现实的方式。而现在&#xff0c;酷开科技作为行业内领军企业&#xff0c;为我们带来了一种全新的居家观影体验&#xff0c;让电影不仅是一种娱乐方式&#xff0c;更是科技的展现。 酷开科技致力于为观众带来…

【MySQL日志与备份篇】数据库备份与恢复

数据库备份与恢复 文章目录 数据库备份与恢复1. 物理备份与逻辑备份2. mysqldump实现逻辑备份2.1 备份一个数据库2.2 备份全部数据库2.3 备份部分数据库2.4 备份部分表2.5 备份单表的部分数据2.6 排除某些表的备份2.7 只备份结构或只备份数据2.8 备份中包含存储过程、函数、事件…

金蝶云星空设置单据体行高

文章目录 金蝶云星空设置单据体行高表单插件Python脚本 金蝶云星空设置单据体行高 表单插件 新建类继承AbstractBillPlugIn&#xff0c;重写OnInitialize方法进行设置 public override void OnInitialize(InitializeEventArgs e){base.OnInitialize(e);this.View.GetControl&…

图片高清重建

图像超分辨率重建&#xff08;super resolution,SR&#xff09;是指利用计算机将一幅低分辨率图像&#xff08;low resolution,LR&#xff09;或图像序列进行处理&#xff0c;恢复出高分辨率图像&#xff08;high resolution&#xff0c;HR&#xff09;的一种图像处理技术。简单…

红海云签约湘湖实验室,助力科研机构人力资源数字化全面升级

湘湖实验室&#xff08;农业浙江省实验室&#xff09;是由浙江省农业科学院和萧山区人民政府共同举办的新型研发机构&#xff0c;定位为农业核心种质资源生物制造与生物互作科学问题和核心技术研究&#xff0c;瞄准世界农业科技发展前沿&#xff0c;面向国家重大战略&#xff0…

Qt执行带参sql

//准备执行的sql语句&#xff0c;此为带参的sql语句query.prepare("update employee set Name:Name, Gender:Gender,Height:Height,"" Birthday:Birthday, Mobile:Mobile, Province:Province,"" City:City, Department:Department, Education:Educati…

DeepFool: a simple and accurate method to fool deep neural networks

DeepFool: a simple and accurate method to fool deep neural networks----《DeepFool&#xff1a;一种简单而准确的欺骗深度神经网络的方法》 摘要 最先进的深度神经网络已经在许多图像分类任务上取得了令人印象深刻的结果。然而&#xff0c;这些相同的架构已被证明对于图像…

使用cmd运行控制面板工具

如何通过键入命令运行“控制面板”工具 - Microsoft 支持 windows自带管理工具&#xff08;exe/cpl/msc&#xff09;-CSDN博客 CMD下打开系统各面板_cmd打开轻松使用面板-CSDN博客 示例&#xff1a; rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl 替换powercfg.…

EXCEL——计算数据分散程度的相关函数

一、PERCENTIL函数 1.函数介绍 通常用来返回数据集给定百分点上的值。 2.函数解读 函数公式&#xff1a; PERCENTILE(数据, 百分点) 参数释义&#xff1a; 数据&#xff08;必填&#xff09;&#xff1a;待处理的数组或数据区域。 百分点&#xff08;必填&#xff09;&…

uview的u-calendar日历组件,当设置了 minDate配置项后,会导致第一次打开日历弹窗,不会精准的滚动到选中的日期(设置了默认日期都没用)

发现需要给month.vue文件里的getMonth方法加一个延时器&#xff0c;猜测是因为设置最小日期后&#xff0c;日历没渲染完毕的时候就已经开始获取节点信息了

基于SSM的超市积分管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…