观察者模式的概念

RxJava是android的异步框架,官方介绍是可观测的序列,组成异步基于事件程序的库。特点是观察者模式,基于事件流的链式调用,随着异步操作调度过程复杂的情况下,程序逻辑也变得越来越复杂,但RxJava依然能够保持简洁。

简单的说观察者A与被观察者B建立订阅关系,当被观察者B发生某种改变时,立即通知观察者A

添加依赖

  1. compile 'io.reactivex.rxjava2:rxjava:2.1.0'
  2. compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

基本模式

Observable被观察者

注意各地方添加泛型避免大片警告,onNext()是事件的回调,onComplete()是事件的结尾。onComplete()与onError互斥需要保持唯一性,并只能调用一次。

  1. Observable<String> observable= Observable.create(new ObservableOnSubscribe<String>() {
  2. @Override
  3. public void subscribe(ObservableEmitter<String> e) throws Exception {
  4. e.onNext("消息1");
  5. e.onNext("消息2");
  6. e.onNext("消息3");
  7. e.onComplete();
  8. }
  9. });

Observer观察者

创建观察者时回调的onSubscribe可以获取Disposable对象,在合适的时候判断条件,调用dispose()即可接触订阅关系

  1. Observer<String> observer=new Observer<String>() {
  2. @Override
  3. public void onSubscribe(Disposable d) {
  4. //通过判断解除订阅关系
  5. d.dispose();
  6. }
  7.  
  8. @Override
  9. public void onNext(String o) {
  10. //对应observable的onNext方法
  11. }
  12.  
  13. @Override
  14. public void onError(Throwable e) {
  15. //对应observable的onError方法
  16. }
  17.  
  18. @Override
  19. public void onComplete() {
  20. //对应observable的onComplete方法
  21. }
  22. };

建立订阅关系

  1. observable.subscribeOn(Schedulers.io()) //指定事件生产在子线程
  2. .observeOn(AndroidSchedulers.mainThread()) //指定事件消费在UI线程
  3. .subscribe(observer);

Observable被观察者的其他模式

  1. //just模式,将自动发送onNext()事件
  2. Observable<String> observable = Observable.just("发送消息");
  3.  
  4. //fromIterable模式,遍历集合,并自动发送onNext()事件
  5. Observable<String> observable = Observable.fromIterable((Iterable<String>) mList);
  6.  
  7. //interval模式,定时自动发送整数序列,从0开始每隔2秒计数,
  8. Observable<Long> observable = Observable.interval(0,2, TimeUnit.SECONDS)
  9.  
  10. //range模式,自动发送特定的整数序列,0表示不发送,负数会抛异常,从1开始发送到20
  11. Observable<Integer> observable = Observable.range(1,20);
  12.  
  13. //timer模式,定时执行观察者的onNext()方法
  14. 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被观察者

  1. Flowable<String> flowable = Flowable.create(new FlowableOnSubscribe<String>() {
  2. @Override
  3. public void subscribe(FlowableEmitter<String> e) throws Exception {
  4. e.onNext("hello RxJava!");
  5. e.onComplete();
  6. }
  7. },BackpressureStrategy.BUFFER);//增加背压模式

Subscriber观察者

onSubscribe()会返回Subscription对象,调用cancel()即可取消订阅关系,request()即可指定消费事件的数量

  1. Subscriber<String> subscriber=new Subscriber<String>() {
  2. @Override
  3. public void onSubscribe(Subscription s) {
  4. s.request(Long.MAX_VALUE);
  5. }
  6.  
  7. @Override
  8. public void onNext(String s) {
  9. Log.i("RxJava", "onNext: "+s);
  10. }
  11.  
  12. @Override
  13. public void onError(Throwable t) {
  14. Log.i("RxJava", "onError");
  15. }
  16.  
  17. @Override
  18. public void onComplete() {
  19. Log.i("RxJava", "onComplete");
  20. }
  21. };
  22. flowable.subscribe(subscriber);//建立订阅关系

Backpressure背压模式

如果生产者和消费者不在同一线程的情况下,如果生产者的速度大于消费者的速度,就会产生Backpressure问题。即异步情况下,Backpressure问题才会存在。

BUFFER

所谓BUFFER就是把RxJava中默认的只能存128个事件的缓存池换成一个大的缓存池,支持存很多很多的数据。
这样,消费者通过request()即使传入一个很大的数字,生产者也会生产事件,并将处理不了的事件缓存。
但是这种方式任然比较消耗内存,除非是我们比较了解消费者的消费能力,能够把握具体情况,不会产生OOM。

DROP

当消费者处理不了事件,就丢弃。
消费者通过request()传入其需求n,然后生产者把n个事件传递给消费者供其消费。其他消费不掉的事件就丢掉

LATEST

LATEST与DROP功能基本一致,唯一的区别就是LATEST总能使消费者能够接收到生产者产生的最后一个事件

ERROR

这种方式会在产生Backpressure问题的时候直接抛出一个异常,这个异常就是著名的MissingBackpressureException

Android 异步框架 RxJava2的更多相关文章

  1. Android 网络框架 Retrofit2

    概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...

  2. Android 异步Http框架简介和实现原理

    在前几篇文章中<Android 采用get方式提交数据到服务器><Android 采用post方式提交数据到服务器><Android 采用HttpClient提交数据到服 ...

  3. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

  4. 基于RxJava2+Retrofit2精心打造的Android基础框架

    代码地址如下:http://www.demodashi.com/demo/12132.html XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载 ...

  5. 2017年Android百大框架排行榜

    框架:提供一定能力的小段程序 >随意转载,标注作者"金诚"即可 >本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. >本文已经开源到Gith ...

  6. android 优秀框架整理

    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...

  7. 2017年Android百大框架排行榜(转)

    一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...

  8. Android开源框架——Volley

    Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架.特别适合数据量小,通信频繁的网络操作.Volley 主要是通过两种 Diapatch ...

  9. Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 本篇文章 ...

随机推荐

  1. \r,\n,\r\n的区别和用法

    https://blog.csdn.net/xiaofei2010/article/details/8458605

  2. [Swift]LeetCode291. 单词模式 II $ Word Pattern II

    Given a pattern and a string str, find if strfollows the same pattern. Here follow means a full matc ...

  3. mysql+postgresql备份与恢复

    mysql备份一个库, mysqldump  -u用户名 -p密码 [选项] [数据库名] > /备份路径/备份文件名 mysqldump -uuser -p123123 auth > / ...

  4. Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)

    一.函数对象  函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象  函数对象的应用 1. 可以直接被引用  fn = cp_fn 2 .可以当作函数参数传递 c ...

  5. 12.Flask-Restful

    定义Restful的视图 安装:pip install flask-restful 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类, ...

  6. docker for mac 创建私有仓库

    拉取镜像 docker pull registry 运行registry run -d -p : -v /Users/huangenai/docker/registry:/var/lib/regist ...

  7. vue + hbuilder 开发备忘录

    踩过的坑: axios 安卓低版本兼容性处理 阻止表单中,button默认事件,出现刷新问题. 设置滚动条的位置 vue 数据和对象数据变化 dom结构不变 android低版本 白屏问题 你是不是用 ...

  8. 微信小程序使用nginx方向代理实现内嵌非业务域名

    通过上一篇文章简单介绍了一下微信小程序的新组件<web-view>,实现了在小程序中内嵌业务域名的功能.但是boss要的小程序中不仅想内嵌业务域名,还想要打开一些非业务域名(无法操作web ...

  9. ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群

    目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...

  10. Lucene 09 - 什么是Lucene的高亮显示 + Java API实现高亮显示

    目录 1 什么是高亮显示 2 高亮显示实现 2.1 配置pom.xml文件, 加入高亮显示支持 2.2 代码实现 2.3 自定义html标签高亮显示 1 什么是高亮显示 高亮显示是全文检索的一个特点, ...