更贴切的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

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法