与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中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S