更贴切的RxJava的入门

2024-02-13 18:50
文章标签 java 入门 rx 贴切

本文主要是介绍更贴切的RxJava的入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

怎么满GitHub的开源项目都是基于RxJava?

最近为了提升自己对代码的理解与阅读能力,在github上面搜索了最近比较火的开源框架,找到地址往下翻后总会看到这样一段话:
网络请求:RxJava & Retrofit+okhttp
这个RxJava和Retrofit是个啥东西?听都没听说过。
懵逼的我马上Google了一下通过一段时间的学习和运用基本有了对其的一些个人理解
明白了为何他们会是现在非常好的网络请求框架广且受开发者们的青睐
下面结合我自己的浅见,向大家分享一下我对这门新技术的理解


什么是RxJava,为什么大家都用他呢

对于我个人而言,RxJava在整个网络框架中担任着异步这一重要的任务,
Retrofit则扮演向服务端请求数据这一角色
同时异步任务它必定有着AsyncTask和Handler不具备的优点
在经过一系列的项目实践之后这个优点更加明显
- 在不断复杂的逻辑之中,它依旧能出淤泥而不染-保持代码的可读性简洁性
Observable.from()
.flatMap(….)
.filter(……)
.map(…)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe
它至上而下为一种链式调用,非常便于我们开发者理解,在逻辑复杂的环境中更加凸显
-响应式编程
安卓中的点击监听器,View在被点击的一瞬间响应事件
客户端在得到服务端返回数据的一瞬间响应操作


在运用之前RxJava你需要掌握

观察者模式

对,就是我们耳熟能祥的设计模式之一———-观察者模式
这里我会以图片的形式重现这一模式,帮助大家理解这种机制的原理
我一直认为代码来源于生活,虽然有一些不贴切,希望大家谅解指正
观察者模式图解

我这里模拟的是前几年经常出现的碰瓷事件(有些不恰当)
那么这个事件中当然有主角和配角
主角-老奶奶 Observable被观察者
配角-围观群众 Observer观察者
-Action-
老奶奶在路上散步
围观群众一直盯着这个老奶奶(高度敏感的监视)看觉得不对劲,走路晃悠悠的
但没人上前询问情况,这时老奶奶在开过来的一辆车接近一米前突然就倒下了
(发生了onPengCi())这时围观群众(反应)有的拿手机拍照(takePhoto()),有的信以为真打电话给警察(callPolice())有的远离现场
-Cut-
这时场景结束了
想必你大约能理解观察者模式的本质了—–对,就是回调
在敏感监视的过程中当被观察者做出动作,这个事件观察者会马上接收到并调用相应的方法

但在上述场景中,你肯定会注意到下面这些细节
1.高度敏感
2.观察者吝啬的活动

这两点便是RxJava所针对此模式所扩展的地方

订阅者模式(扩展的观察者模式,个人见解莫怪)

二话不说,上图
订阅者模式
熟悉的场景再一次显现
这里的不同之处在于
老奶奶倒地之后打了个电话给他儿子(通知观察者)
围观群众里有这时站出来一个人正是他儿子
因为之前与老奶奶商量(签订协议)敲诈这车主一波
他马上上前说老奶奶受伤严重索要赔偿

这里的不同之处,想必大家都明白了
这里以一种注册订阅的理念,取代了繁琐的监视操作更加灵活
能够以响应的姿态使订阅者进入角色
而订阅者的活动更加丰富具体,演技更加到位


RxJava基本使用

在使用之前希望大家能知道下面的基本概念

  • Observer观察者
  • Subscriber订阅者
  • Observable被观察者
  • Scheduler调度器

RxJava的subscribe过程中,Observer 总是会先被转换成一个Subscriber再使用
所以其中都是基于订阅机制实现的

前三个想必大家都知晓了,那么最后一个呢?
Schaeduler调度器,他相当于安卓中的线程控制器
默认RxJava中遵循的是线程不变的原则
即:
在哪个线程调用 subscribe(),就在哪个线程生产事件;
在哪个线程生产事件,就在哪个线程消费事件。

但如果需要切换线程,就需要用到 Scheduler (调度器)。
线程的分类:
Schedulers.immediate()当前线程
Schedulers.newThread()新开线程
Schedulers.io()IO线程 读写文件数据库,请求网络
Schedulers.computation()密集型计算专用
AndroidSchedulers.mainThread()主线程

线程的控制:
subscribeOn() 和 observeOn()
- subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
- observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。

至此,到了代码阶段,让我们一起实现RxJava最简单的实现吧!

上代码

//1.创建订阅者
Subscriber<String> subscriber = new Subscriber<String>() {@Overridepublic void onNext(String s) {Log.d(tag, "Item: " + s);}@Overridepublic void onCompleted() {Log.d(tag, "Completed!");}@Overridepublic void onError(Throwable e) {Log.d(tag, "Error!");}
};
//2.创建被观察者
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> subscriber) {//传入跟他订阅关系的订阅者//被订阅时候调用subscriber.onNext("Hello");subscriber.onNext("Hi");subscriber.onNext("Aloha");subscriber.onCompleted();}
});
//3.签订契约吧少年
observable.subscribe(subscriber);

当订阅之后就会执行被观察者的call方法再回调观察者的实现
这样我们最简单的RxJava用法就完成了!


最后

对于 Android 开发者来说, RxJava 是一个很难上手的库,对于Android新手来说,他更是难以理解,因此我写这篇文章是结合我们的生活来讲述代码,让大家都能听得懂,能给大家一些入门的指引,当然这只是我个人的浅见登不上大雅之堂,无论如何,只要能给各位同为 Android 工程师的你们提供一些帮助,这篇文章的目的就达到了。


关于作者

陈鸿(大四在校学生,目前寻找实习中)
QQ:568261070
GitHub:https://github.com/MrCodeSniper

这篇关于更贴切的RxJava的入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706347

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav