RxJava是一个很好的开源库,将链式编程和异步很好的结合在一起。在介绍RxJava之前我们先介绍一下观察者模式,这样我们能更好的学习和理解RxJava。

简单介绍一下,A和B两个,A是被观察者,B是观察者,B对A进行观察,B并不是需要时刻盯着A,而是A如果发生了变化,会主动通知B,B会对应做一些变化。

如上图,假设A是连载小说,B是读者,读者订阅了连载小说,当小说出现了新的连载的时候,会推送给读者。读者不用时刻盯着小说连载,而小说有了新的连载会主动推送给读者。这就是观察者模式。而RxJava正是基于观察者模式开发的。

一、RxJava的基础使用

目前主流的RxJava使用的版本为RxJava2系列,在使用之前我们需要先引入RxJava2.0相关的类库:

 implementation 'io.reactivex.rxjava2:rxjava:2.2.13'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

使用方式:

1). 创建被观察者:

//  创建被观察者
Observable novelObservable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
observableEmitter.onNext("新章节1001");
observableEmitter.onNext("新章节1002");
observableEmitter.onNext("新章节1003");
observableEmitter.onComplete();
}
});
Observable中文意思就是被观察者,通过create方法生成对象,里面放的参数ObservableOnSubscribe<T>,可以理解为一个计划表,泛型T是要操作对象的类型,重写subscribe方法,里面写具体的计划,本文的例子就是推送新章节1001、新章节1002和新章节1003,在subscribe中的ObservableEmitter<String>对象的Emitter是发射器的意思。
ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void onError(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。

2). 创建观察者

// 创建观察者
Observer<String> reader = new Observer<String>() {
@Override
public void onSubscribe(Disposable disposable) {
doLog("subscribe success");
} @Override
public void onNext(String s) {
doLog("收到最新章节 ===》" + s);
} @Override
public void onError(Throwable throwable) { } @Override
public void onComplete() {
doLog("接受结束!");
}
};
novelObservable.subscribe(reader);
通过new创建接口,并实现其内部的方法,看方法其实就应该差不多知道干嘛的,onNext、onError、onComplete都是跟被观察者发射的方法一一对应的,这里就相当于接收了。onSubscribe(Disposable d)里面的Disposable对象要说一下,Disposable英文意思是可随意使用的,这里就相当于读者和连载小说的订阅关系,如果读者不想再订阅该小说了,可以调用 mDisposable.dispose()取消订阅,此时连载小说更新的时候就不会再推送给读者了。

3). 将订阅者和被订阅者建立关系

novelObservable.subscribe(reader);

运行代码,查看输出结果如下:

总结:以上就是RxJava2最简单的用法,总结一下就是:

1).  创建被订阅者

2).  创建订阅者

3).  建立订阅关系

二、RxJava异步链式编程

RxJava 是支持异步的,核心就是 Scheduler (调度器),RxJava用 Scheduler 来控制线程。

当我们没有设置 Scheduler 的时候,RxJava遵循在哪个线程启动,就在哪个线程运行的原则。

例:一般情况下我们在使用RxJava的时候都是后台执行,前台调用的,本着这个原则,我们需要调用observeOn(AndroidSchedulers.mainThread()),subscribeOn(Schedulers.io())。

这里observeOn是事件回调的线程,AndroidSchedulers.mainThread()一看就知道是主线程;subscribeOn是事件执行的线程,Schedulers.io()是子线程,这里也可以用Schedulers.newThread(),只不过io线程可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。

下面我们改造一下第一节的代码,改造后如下:

Log.e("111", "主Thread Hash = " + Thread.currentThread().hashCode());
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
Log.e("111", "被订阅Thread Hash = " + Thread.currentThread().hashCode());
observableEmitter.onNext("新章节1001");
observableEmitter.onNext("新章节1002");
observableEmitter.onNext("新章节1003");
observableEmitter.onComplete();
}
}).subscribeOn(Schedulers.io()) // 执行在io线程
.observeOn(AndroidSchedulers.mainThread()) // 回调在主线程
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable disposable) {
doLog("subscribe success");
} @Override
public void onNext(String s) {
Log.e("111", "订阅Thread Hash = " + Thread.currentThread().hashCode());
doLog("收到最新章节 ===》" + s);
} @Override
public void onError(Throwable throwable) { } @Override
public void onComplete() {
doLog("接受结束!");
}
});

输出结果:

E/111: 主Thread Hash = 72810649
E/111: 日志 -----> subscribe success
E/111: 被订阅Thread Hash = 68064815
E/111: 订阅Thread Hash = 72810649
E/111: 日志 -----> 收到最新章节 ===》新章节1001
订阅Thread Hash = 72810649
日志 -----> 收到最新章节 ===》新章节1002
订阅Thread Hash = 72810649
日志 -----> 收到最新章节 ===》新章节1003
日志 -----> 接受结束!

三、RxJava的应用场景

1). RxJava + Retrofit 封装网络请求框架

2). 基于RxJava的开源类库 Rxpermissions、RxBinding、RxBus

四、参考资料

1). RxJava2.0——从放弃到入门:https://www.jianshu.com/p/cd3557b1a474

2). 打造终极MVP+Retrofit2+okhttp3+Rxjava2网络请求:https://www.jianshu.com/p/df4eee78085c

 

Android框架式编程之RxJava(一):HelloWorld的更多相关文章

  1. Android框架式编程之Android Architecture Components

    1. 当前Android开发面临的问题 Android开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在:而一个典型的Android应用通常由多个应用组件构成,包括 ...

  2. Android框架式编程之BufferKnife

    配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharto ...

  3. Android框架式编程之Room

    Room是Google官方出品的ORM(Object-relational mapping) 框架.当前我们也知道当前还有很多的ORM框架,例如GreenDao.OrmLite.Litepal等.目前 ...

  4. Android框架式编程之Retrofit

    一.Retrofit 简介 Retrofit 官网地址: https://github.com/square/retrofit Retrofit(即Retrofit,目前最新版本为2.6.0版本),是 ...

  5. Android框架式编程之Lifecycle

    Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle. 一.为什么要使用Lifecy ...

  6. Android框架式编程之EasyPermissions

    EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...

  7. Android框架式编程之LiveData

    一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ...

  8. Android框架式编程之EventBus

    一.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus. 它简化了应用程序内各个组件之间进行通信的复杂 ...

  9. Android框架式编程之MVP架构

    MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...

随机推荐

  1. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

  2. CentOS 安装Python3.x常见问题

    CentOS 6.x自带的Python版本是2.6,CentOS 7.x上自带的是2.7,我们要自己安装Python3.X,配置环境,不过一般安装过程不会一帆风顺,往往有些报错,在CentOS以及其他 ...

  3. SwaggerUI--SosoApi

    1.SwaggerUI是什么? Swagger UI是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger-UI 的官方地址:http://swagger.io/ Github ...

  4. 图解HTTPS建立过程

    阅读目录 准备工作(对应图中prepare1234) 发起链接 最后 关于网络安全加密的介绍可以看之前文章: 1. 网络安全——数据的加密与签名,RSA介绍2. Base64编码.MD5.SHA1-S ...

  5. ORA-12737: Instant Client Light: unsupported server character set CHS16GBK

    当使用Navicat Premiun 英文版连接oracl时可能会报ORA-12737: Instant Client Light: unsupported server character set ...

  6. js定时器让动画隔秒运动

    现有一个需求,宝箱隔几秒动一次,抓住用户眼球,自己写了个 doem.

  7. java中位运算

    1byte(字节)=8bit(比特) 1 0 0 0 0 0 0 0 1   2进制的1的原码 反码 补码 0 0 0 0 0 0 0 0   2进制的0的原码 反码 补码 -1 1 0 0 0 0 ...

  8. attr和prop的区别以及在企业开发中应该如何抉择

    attr和prop有很多相同的地方,比如都可以操作标签的属性节点,而且获取的时候都只可以获取到相同节点的第一个,例如这样: $('span').attr('class');和$('span').pro ...

  9. postgres 数据库的安装

    环境:Linux version 2.6.32-642.el6.x86_64   软件版本:postgresql-9.6.8.tar.gz 新项目要上线测试,要求安装一个PG 的数据库 我们进行的是源 ...

  10. BZOJ_4765_普通计算姬_分块+dfs序+树状数组

    BZOJ_4765_普通计算姬_分块 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能 ...