与RxJava的第一次接触

2024-08-31 15:32
文章标签 java 第一次 rx 接触

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

转载请注明出处
作者:AboutJoke ( http://blog.csdn.net/u013200308 )
原文链接:http://blog.csdn.net/u013200308/article/details/53559707


初识

RxJava出来有一年多了吧,但貌似理解和使用的人不是很多的样子,我也是由于使用Retrofit才接触到。那么RxJava是什么呢?GitHub主页的介绍上写到:

RxJava is a Java VM implementation of Reactive Extensions: a libraryfor composing asynchronous and event-based programs by using observable sequences.

翻译过来就是:RxJava是Reactive Extensions的Java VM实现:用于通过使用可观察序列来编译异步和基于事件的程序的库。嗯,谷歌翻译的。虽然看起来有点生硬,但也能让我们大概的读懂意思。简单的概括来说就是:异步 ,想想我们使用过的AsyncTask,handler都是为了实现异步,可以说在我们日常开发中异步是一种必不可少的实现方式。那既然已经有了AsyncTask和handler,那为什么我们还要去学习和使用RxJava?而且看起来还很难懂得样子。首先作为一个程序员,要有时刻去学习新知识的动力,其次既然有很多人推崇,看看GitHub上1w+的star,就可想而知他肯定有自己的独到之处,至于是什么,就让我们一起在学习中来了解。

接触

首先放上RxJava的地址:https://github.com/ReactiveX/RxJava
RxAndroid:https://github.com/ReactiveX/RxAndroid
然后引入依赖:

compile ‘io.reactivex:rxjava:1.1.6’
compile ‘io.reactivex:rxandroid:1.2.1’

还有一个对于我们Android开发者来说比较重要的RxAndroid,这个库是对RxJava的扩展,可以让我们在Android开放中使用起来更加的方便,当然你也可以只使用RxJava。如果你还不知道如何依赖的话,得赶紧补补了。现在RxJava已经出2.0版本了,但由于我是在1.0+版本时期去学习和使用的,所以本篇博客也只以1.0+版本为例。2.0版本如果和1.0+版本相差较大,我后续也会对2.0版本推出博客。

好了,做好准备工作我们就来揭开RxJava的面纱吧。首先我们先看看RxJava的一般写法:

public void demo1() {Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> sub) {sub.onNext("Hello, world!");sub.onCompleted();}});Subscriber<String> mySubscriber = new Subscriber<String>() {@Overridepublic void onNext(String s) {L.e(s);}@Overridepublic void onCompleted() {L.e("success");}@Overridepublic void onError(Throwable e) {}};myObservable.subscribe(mySubscriber);}

RxJava主要由Observable(被观察者),Subscriber(观察者,订阅)来组成。我们可以用一个很简单的例子来解释一下,开关和灯。Subscriber是灯,Observable是开关,他们通过电线连接在一起。当开关打开的时候,灯会观察到或者被通知就会点亮。Rxjava也是这样,Observable发出事件,Subscriber执行事件。在我们上面的代码中,通过如下代码创建了Observable,并且发出了一个字符串。

Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> sub) {sub.onNext("Hello, world!");sub.onCompleted();}});

有了Observable,有了事件,我们再来创建一个Subscriber,让他来执行事件

Subscriber<String> mySubscriber = new Subscriber<String>() {@Overridepublic void onNext(String s) {L.e(s);}@Overridepublic void onCompleted() {L.e("success");}@Overridepublic void onError(Throwable e) {}};

可以看见他有三个方法:

  1. onNext:执行事件的地方,Observable发出的事件将会在这里被执行。
  2. onCompleted:当一个事件完结的时候,必然会回调的方法。
  3. onError:当执行事件过程中发生错误,必然会回调的方法。

观察者和被观察者都创建好了,也就是灯和开关都有了,那我们该用电线把他们连接起来了。

myObservable.subscribe(mySubscriber);

可能大部分同学看到这里都会很纳闷,怎么被观察者订阅了观察者?其实这样的设计是为了不对流式API的设计造成影响,所以我们在理解的时候得稍微的转换一下。

解决了上面的问题,看到这的同学也会说,为了异步输出一个字符串写了这么多代码是不是太多余了?我用AsyncTask或者handler怎么写都比你这个简洁。那么我们下面来将上面的代码简洁一下。

了解

RxJava有很多的函数来方便我们的使用,比如我们可以使用just方法来创建一个只发出一个事件就结束的Observable,看代码:

Observable<String> myObservable = Observable.just("Hello, world!");

下面我们再来简化Subscriber,Subscriber有三个重载方法, Action1 < Object >,Action1< Throwable >以及Action0。分别对应了OnNext,OnComplete, OnError函数。当我们只关心OnNext方法时,上述代码可以简化为:

Action1<String> action = new Action1<String>() {@Overridepublic void call(String s) {L.e(s);}};

那么我们再把他们连接起来:

myObservable.subscribe(action);

是不是一下简洁了很多,什么?还不够?那我可要祭出大杀器了:

Observable.just("Hello, world!").subscribe(s -> L.e(s));

是不是被震惊了,上述的代码可以用这简单的一行来表示。在这里我们用到了lambda表达式,至于什么是lambda表达式,相信很多同学都有所耳闻了,在这里我们就不详细解释了,具体可以去看其他文章或者我再写一篇关于lambda的?(又给自己挖坑了)。如何想要使用的话,请确保你的jdk版本为1.8,并在项目的Gradle文件里在defaultConfig的闭包里加入:

jackOptions {
enabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

然后再编译一下,就可以开心的使用了,低版本的话可以使用retrolambda,当然你在使用lambda爽快的同时可能也会导致自己或者同事难以理解自己的代码,取舍就在自己了。

好了,看完上面的内容,想必大家都已经产生了一些兴趣。但是我们的第一次接触呢到这里就结束了,更有魅力的东西我们留着下次再说,下次我将把RxJava与Retrofit结合起来,分享给大家,哈哈哈。

大家可以通过下面的一些文章去更好的了解,毕竟我道行还浅。

给 Android 开发者的 RxJava 详解
深入浅出RxJava系列

这篇关于与RxJava的第一次接触的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2