与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的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据