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. Spring提取@Transactional事务注解的源码解析

    声明:本文是自己在学习spring注解事务处理源代码时所留下的笔记: 难免有错误,敬请读者谅解!!! 1.事务注解标签 <tx:annotation-driven /> 2.tx 命名空间 ...

  2. LoadRunner Mysql性能优化

    原文:https://blog.csdn.net/u011910905/article/details/49863787 一.查询与索引优化分析 1.show命令: show engines; 显示存 ...

  3. 关于如何给<input type="date">设置默认当前日期的方法 和 给table固定宽度

    var ddd = new Date(); var day =ddd.getDate(); if(ddd.getMonth()<10){ var month = "0"+(d ...

  4. python获取操作系统平台、版本及架构

    platform模块提供了底层系统平台的相关信息 系统架构 32位还是64位 >>>import platform >>> platform.architectur ...

  5. 提示“本地连接没有有效的ip配置-未修复“窗口

    很多人在使用电脑时可能会遇到了这样一个网络问题,电脑无法连接网络,使用自带网络诊断工具诊断提示:"本地连接没有有效的ip配置".这种网络故障多数是出在使用路由器共享上网的windo ...

  6. Golang中使用lua进行扩展

    前言 最近在项目中需要使用lua进行扩展,发现github上有一个用golang编写的lua虚拟机,名字叫做gopher-lua.使用后发现还不错,借此分享给大家. 数据类型 lua中的数据类型与go ...

  7. Django 项目搭建(ubuntu系统)

    1 环境搭建 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境,这里展示virtualenv vi ...

  8. 学习React Native必看的几个开源项目

    学习React native ,分享几个不错的开源项目,相信你学完之后,一定会有所收获.如果还没有了解RN的同学们可以参考手把手教你React Native 实战之开山篇<一> 1.Fac ...

  9. TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)

    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...

  10. quillJS 富文本编辑器源码分析系列1

    quillJS 富文本编辑器目前是一款很火富文本编辑器,使用广泛,github 上面的 star 有 22,492,虽然说不以 star 论英雄,不过这可以说明它还是比较受欢迎的: 它的特点是:轻量, ...