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

news/2024/11/29 9:56:19/

简单介绍

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>() {@Overridepublic Boolean call(Integer integer) {mText.append("\n\n map()  Integer--->Boolean");return (integer<3);}}).subscribe(new Action1<Boolean>() {@Overridepublic 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>(){@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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.ppmy.cn/news/1216919.html

相关文章

git cherry-pick命令(合并单个或多个提交记录到当前分支)

文章目录 一、如何使用二、注意事项三、总结 Git cherr-pick&#xff1a;选择性合并提交 在项目中&#xff0c;我们常常需要选择性的把某个提交或某些提交单独的合并到当前分支&#xff0c;Git 提供了一个称为 cherry-pick 的命令来执行这个操作。 一、如何使用 1、要在当前分…

linux概念基础认识(基于阿里云ecs服务器操作)

文章目录 linux基本介绍SSH登录方式linux系统目录结构FHS介绍linux基础操作命令修改命令提示符名称时间同步Hash缓存表文件通配符创建硬链接创建软连接软连接与硬链接的区别 查看是否是文件或文件夹命令令牌文本管理工具nanovimgrepsed 用户和权限root用户用户组 linux权限构成…

windows10上使用Visual Studio对树莓派进行交叉编译示例

本文主要介绍通过Visual Studio对树莓派进行交叉编译的方法。 1 环境 宿主机&#xff1a; 系统&#xff1a;Windows10 开发平台&#xff1a;Visual Studio 2022 (我用的是社区版) VisualGDB: VisualGDB - Download (我下的试用版本) GNU工具链: Prebuilt GNU toolchain f…

设计模式系列之最终篇:大盘点

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4000多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

使用 Redis 实现生成分布式全局唯一ID(使用SpringBoot环境实现)

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1、使用 Redis 计数器实现2.2、使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1、编写获取工具3.2、测试获取工具 四、总结 一、前言 在很多项目中生成类似订单编号、用户编号等有唯一性数…

Android设计模式--Builder建造者模式

一&#xff0c;定义 Builder模式是一步一步创建一个复杂对象的创建型模式&#xff0c;它允许用户在不知道内部构建细节的情况下&#xff0c;可以更精细的控制对象的构造流程。 也就是将一个对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二&…

DEC 深度编码聚类函数

2. 辅助目标函数 要使用输入 (bt, groups, embed_dim) 计算 DEC 模型的目标分布&#xff0c;关键部分是使用软分配 q &#xff0c;其形状为 (bt, groups, max_cluster) 。这里&#xff0c; max_cluster 是您要定位的集群数量。当您沿该维度执行聚类时&#xff0c;需要跨 group…

C++ 11 新特性

目录 1. 支持特性的编译器版本2. 模板表达式中空格3. 空指针4. auto5. 统一初始化6. explict7. 范围for8. default&#xff0c;delete9. 化名模板&#xff08;alias template&#xff09;10. using11. noexcept12. override13. final14. decltype15. lambda16. Variadic Templa…