Android 异步框架 RxJava2
观察者模式的概念
RxJava是android的异步框架,官方介绍是可观测的序列,组成异步基于事件程序的库。特点是观察者模式,基于事件流的链式调用,随着异步操作调度过程复杂的情况下,程序逻辑也变得越来越复杂,但RxJava依然能够保持简洁。
简单的说观察者A与被观察者B建立订阅关系,当被观察者B发生某种改变时,立即通知观察者A
添加依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
基本模式
Observable被观察者
注意各地方添加泛型避免大片警告,onNext()是事件的回调,onComplete()是事件的结尾。onComplete()与onError互斥需要保持唯一性,并只能调用一次。
Observable<String> observable= Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("消息1");
e.onNext("消息2");
e.onNext("消息3");
e.onComplete();
}
});
Observer观察者
创建观察者时回调的onSubscribe可以获取Disposable对象,在合适的时候判断条件,调用dispose()即可接触订阅关系
Observer<String> observer=new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
//通过判断解除订阅关系
d.dispose();
}
@Override
public void onNext(String o) {
//对应observable的onNext方法
}
@Override
public void onError(Throwable e) {
//对应observable的onError方法
}
@Override
public void onComplete() {
//对应observable的onComplete方法
}
};
建立订阅关系
observable.subscribeOn(Schedulers.io()) //指定事件生产在子线程
.observeOn(AndroidSchedulers.mainThread()) //指定事件消费在UI线程
.subscribe(observer);
Observable被观察者的其他模式
//just模式,将自动发送onNext()事件
Observable<String> observable = Observable.just("发送消息"); //fromIterable模式,遍历集合,并自动发送onNext()事件
Observable<String> observable = Observable.fromIterable((Iterable<String>) mList); //interval模式,定时自动发送整数序列,从0开始每隔2秒计数,
Observable<Long> observable = Observable.interval(0,2, TimeUnit.SECONDS) //range模式,自动发送特定的整数序列,0表示不发送,负数会抛异常,从1开始发送到20
Observable<Integer> observable = Observable.range(1,20); //timer模式,定时执行观察者的onNext()方法
Observable<Integer> observable = Observable.timer(2, TimeUnit.SECONDS);
Observable被观察者的更多创建方式以及操作符
如创建操作,数据过滤操作,条件操作,转载以下博客,很详细:
RxJava操作符大全
Scheduler调度器
四种常见模式
Schedulers.immediate() 默认模式,在当前线程运行
Schedulers.newThread() 创建新的子线程运行
Schedulers.io() 创建新的子线程运行,内部使用的是无上限的线程池,可重用空闲的线程,效率高
AndroidSchedulers.mainThread() 在UI主线程运行
订阅事件时的生产与消费线程
subscribeOn() 指定Observable(被观察者)所在的线程,或者叫做事件产生的线程
observeOn() 指定 Observer(观察者)所运行在的线程,或者叫做事件消费的线程
新的观察者模式
Flowable被观察者
Flowable<String> flowable = Flowable.create(new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> e) throws Exception {
e.onNext("hello RxJava!");
e.onComplete();
}
},BackpressureStrategy.BUFFER);//增加背压模式
Subscriber观察者
onSubscribe()会返回Subscription对象,调用cancel()即可取消订阅关系,request()即可指定消费事件的数量
Subscriber<String> subscriber=new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(String s) {
Log.i("RxJava", "onNext: "+s);
}
@Override
public void onError(Throwable t) {
Log.i("RxJava", "onError");
}
@Override
public void onComplete() {
Log.i("RxJava", "onComplete");
}
};
flowable.subscribe(subscriber);//建立订阅关系
Backpressure背压模式
如果生产者和消费者不在同一线程的情况下,如果生产者的速度大于消费者的速度,就会产生Backpressure问题。即异步情况下,Backpressure问题才会存在。
BUFFER
这样,消费者通过request()即使传入一个很大的数字,生产者也会生产事件,并将处理不了的事件缓存。
但是这种方式任然比较消耗内存,除非是我们比较了解消费者的消费能力,能够把握具体情况,不会产生OOM。
DROP
当消费者处理不了事件,就丢弃。
消费者通过request()传入其需求n,然后生产者把n个事件传递给消费者供其消费。其他消费不掉的事件就丢掉
LATEST
LATEST与DROP功能基本一致,唯一的区别就是LATEST总能使消费者能够接收到生产者产生的最后一个事件
ERROR
这种方式会在产生Backpressure问题的时候直接抛出一个异常,这个异常就是著名的MissingBackpressureException
Android 异步框架 RxJava2的更多相关文章
- Android 网络框架 Retrofit2
概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...
- Android 异步Http框架简介和实现原理
在前几篇文章中<Android 采用get方式提交数据到服务器><Android 采用post方式提交数据到服务器><Android 采用HttpClient提交数据到服 ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- 基于RxJava2+Retrofit2精心打造的Android基础框架
代码地址如下:http://www.demodashi.com/demo/12132.html XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载 ...
- 2017年Android百大框架排行榜
框架:提供一定能力的小段程序 >随意转载,标注作者"金诚"即可 >本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. >本文已经开源到Gith ...
- android 优秀框架整理
程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...
- 2017年Android百大框架排行榜(转)
一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...
- Android开源框架——Volley
Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架.特别适合数据量小,通信频繁的网络操作.Volley 主要是通过两种 Diapatch ...
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...
随机推荐
- 阿里面试题,深入理解Java类加载机制
类的生命周期 包括以下 7 个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使 ...
- linux系统安装cdcfordb2udb
最近接触到db2数据库实时复制的解决方案InfoSphere CDC(Change Database Capture) .主要是通过读取源端的日志信息对目标端进行数据的增删改,从而尽量减少对源端资源的 ...
- 当使用vue的按键修饰符不起效果的时候怎么办?如@keyup.enter = '' ;
这个问题困扰了我一个多小时,各种测bug !始终测不出来! 直接上代码(错误示范) <el-form-item prop="password"> <el-inpu ...
- 如何为自己的pip包打造可以执行的系统命令
1.我们在打包我们自己的Python Package的时候.我们不仅可以在代码中使用我们的package,而且可以添加一些可执行命令来执行自己的函数. 2 .我们应该怎么办呢? 1.首先新建目录以及文 ...
- Xapian索引-文档检索过程分析
本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1 检索语法 面对不同的检索业务,我们会有多种检索 ...
- 4.Django模板语言和分页
继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...
- 概率分布之间的距离度量以及python实现(三)
概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 . 1.卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson ...
- Pycharm使用教程(三)(非常详细,非常实用)
1. 汉化:把resources_zh.jar拷贝到PyCharm的安装目录下的lib目录,重启Pycharm即可. (resources_zh.jar汉化包关注本账号获取:链接: https://p ...
- .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练
写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...
- 一致 Hash 算法分析
当我们在做数据库分库分表或者是分布式缓存时,不可避免的都会遇到一个问题: 如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少. Hash 取模 随机放置就不说了,会带来很多问 ...