RXAndroid 起源于RXJava,体现了响应式的编程规范,可以方便地处理异步数据流,强调对数据的观察与处理的流程

Why To Use

RxAndroid 我们真正要使用的其实是Rx,安不安卓无所谓,Rx即reactivex,翻译过来就是反应式,应用过来就是体现了响应式编程的思想,一个事件下来从开始到结束都能很方便地在链式结构中查看,能知道每一步的变换情况,让这个事件变成一个整体,对于后期拓展或修改都很方便,如果没有响应式编程的思想,一个需求写下来将是零散的,每一步的结构并不明朗,对于定位问题或拓展需求将带来巨大的麻烦

How To Use

导入依赖

 implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'implementation 'io.reactivex.rxjava3:rxjava:3.0.0'

GitHub地址:RxAndroid

核心API

使用的总体思路:事件从一个起点出发(Observable),经过各种变换(map等),到达终点接收(Observer)
Observable被观察者,事件由被观察者发出
Observer 观察者,事件由观察者接收
Subscribe订阅,将观察者与被观察者建立关系,返回Disposable对象,可用于取消订阅,事件可保持在CompositeDisposable 中统一处理,事件从subscriber触发执行,到达onSubscribe接口处理初始化工作,然后有被观察者调用创建事件操作符开始事件传递,每一次事件触发一个onNext,所有的事件完成触发onComplete
SubscriberWith会把方法参数返回回去接收的是ResourceSubscriber,
而ResourceSubscriber实现了Disposable接口所以,一般subscribeWith用到使用Rx请求接口的这种情况,订阅后把请求参数返回回去,可以添加到CompositeDisposable中方便绑定Activity生命周期取消
AndroidObservable针对Android的拓展,可绑定activity(bindActivity())或fragment,生命周期结束时会停止发送消息
Flowable支持背压的被观察者,为处理事件太多处理不过来导致的内存溢出问题
FlowableSubscriber支持背压的观察者,通过request告知发送多少数据,背压报错会默认回调到onError,程序不会崩溃

Flowable.just("1","2","3").subscribe(new FlowableSubscriber<String>() {Subscription sub;            @Overridepublic void onSubscribe(@NonNull Subscription s) {sub=s;s.request(1);//代表接收的次数,如果次数小于总的next次数,不会回调onComplete反之结束会调用onComplete}@Overridepublic void onNext(String s) {sub.request(1);}@Overridepublic void onError(Throwable t) {}@Overridepublic void onComplete() {}});

Single被观察者,只支持发送一次事件
Maybe被观察者 能发送0或1个事件,要么成功,要么失败
Completable被观察者 只发送完成或错误事件

操作符

操作类型 操作符
创建操作 create,defer,empty,never,throw,from,interval,just,range,repeat,start,timer
变换操作 map,buffer,flatMap,groupBy,scan,window
过滤操作 fliter,debounce,distinct,elementAt,first,ignoreElements,last,sample,skip,skipLast,take,takeLast
组合操作 and,then,when,combineLatest,join,Merge,startWith,switch,zip,compose
错误处理 catch,retry
辅助操作 delay,do,materialize,dematerialize,observerOn,subscribeOn,serialize,subscribe,timeInterval,timeout,timestamp,using
条件操作 all,amb,contains,defaultlfEmpty,sequenceEqual,skipUntil,skipWhile,takeUntil,takeWhile
算术集合操作 average,concat,count,max,min,reduce,sum
转换操作 to
连接操作 connect,publish,refCount,replay

create 创建一个被观察者,通过emitter操作发送事件

Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {emitter.onNext("1");emitter.onError(new Throwable());emitter.onComplete();}});

fromXXX()将一个源快速发射出去,这个源可以是列表,可以是action,类似于observable中T的角色

Observable<String> observable=Observable.fromArray(list);

megreArrayconcatArray是将多个源混合发送,相当于共用一个接收者的意思,不同的是megre不保证发送的顺序,concat保证发射的顺序,同时concat在每组结束后要显示调用onComplete

Publisher[] sources = new Publisher[localPaths.size()];
sources[0]=new Publisher<String>(){@Overridepublic void subscribe(Subscriber<? super String> observer){observer.onNext("1");observer.onComplete();}
}
....
Flowable.concatArray(sources).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new FlowableSubscriber<String>() {@Overridepublic void onSubscribe(Subscription s) {s.request(sources.length);}@Overridepublic void onNext(String s) {}@Overridepublic void onError(Throwable t) {}@Overridepublic void onComplete() {}});

just快速创建一个被观察者,发射一个just内的事件然后结束

Observable<String> observable=Observable.just("111");

Consumer快速创建一个观察者,只实现接收功能

Consumer<String> consumer=new Consumer<String>() {@Overridepublic void accept(String s) throws Throwable {text.setText(s);}};

Action 快速创建一个观察者,只实现完成功能

Action action=new Action() {@Overridepublic void run() throws Throwable {doOver();}};observable.subscribe(consumer,null,action);

compose 组合封装常用的固定操作
subscribeOn指定被观察者的发送线程,传入一个线程调度器
observeOn指定观察者的接收线程,传入一个线程调度器
Schedulers线程调度器,包含4种调度模式
1.Schedulers.io() IO操作,内部是个无数量上限的线程池实现,可重用空闲线程
2.Schedulers.newThread() 开启新线程
3.Schedulers.trampoline() 当前线程,如果当前线程有任务立即停止,执行完该任务后继续
4.Schedulers.computation() 计算所使用,固定的线程数,等于CPU核数
5.AndroidSchedulers.mainThread() Android主线程调度器,针对Android的拓展
6.Schedulers.from()指定线程池
下方指定发送在IO线程,接收在主线程,也可以多次指定,表面调用一次后就会切换一次

observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(consumer,null,action);

map()基本变换操作符,传入一个function对象,通过实现apply方法将事件转换对象发射出去

.map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) throws Throwable {return null;}})

flatmap()扁平映射,将数据放入Observables集合
scan()扫描操作
fliter()过滤变换操作,传入predicate对象,实现test接口,返回false表示拦截此次发射

.filter(new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) throws Throwable {return false;}})

doOnNext()执行该方法再执行下一步,执行顺序与书写的位置有关,不会改变正在发射的数据

 .doOnNext(new Consumer<String>() {@Overridepublic void accept(String integer) throws Throwable {}})

take()最多保留操作,限制最多保留几个事件

.take(2)

zip()打包变换操作,将2个不同的的订阅源数据通过apply变换得到数据发射出去,适用于多个数据源结合显示的情况,2个数据源有一边发射的数据少时,按最少的处理,多发的将不会被匹配上

 Observable.zip(observable, observable, new BiFunction<String, String, Integer>() {@Overridepublic Integer apply(String s, String s2) throws Throwable {return null;}}).subscribe(consumer);

进阶版

rxbinding 使用

针对AndroidUI操作给出一系列简单使用的操作符
GitHub地址 RxBinding

导入Rxbinding库,无需再导入rxjava和rxAndroid

api 'com.jakewharton.rxbinding4:rxbinding:4.0.0'

导入时发现导入4.0.0版本不能引用RxView,导入2.0.0就能用?暂时不清楚原因,有大神知道的望评论告知

rxbinding库主要是对UI操作事件封装成被观察者,使用订阅的形式对事件进行操作,主要的操作有:
throttleFirst设定指定时间内只响应一次事件,处理点击抖动
textChanges文本变动事件,可用于输入监听,结合其他操作符如combineLatest可用于判空设置按钮是否可点
debounce设置多长事件未改变就执行,一般用于判断输入完成执行搜索等动作

参考

Rxjava3文档级教程
Rxjava subscribe()和subscribeWith()使用场景分析
Rxbinding 的基本使用
RxJava Compose的作用
observeOn()与subscribeOn()的详解

【Android】RXAndroid相关推荐

  1. 【Android】Parse开发笔记(1)—— 准备

    一.简介 Parse是由 YC 孵化出来的.专为移动应用提供后台服务的云计算平台,为开发者包办繁琐的后台服务,让开发者只需专注于具体的开发工作.它提供任意数据保存.照片或其它文件存储.发送推送通知.创 ...

  2. 【Android】显示Emoji表情字符

    一.下载AndroidEmoji.ttf字体 地址1:Github Android Platform 地址2:AndroidEmoji.ttf.zip 二.使用 2.1 将字体拷贝到assets/fo ...

  3. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  4. android编程中添加gif,Android应用开发之【Android】使用android-gif-drawable包加载GIF动图...

    本文将带你了解Android应用开发之[Android]使用android-gif-drawable包加载GIF动图,希望本文对大家学Android有所帮助. [导包] 首先需要导入android-g ...

  5. 【Android】保存Fragment切换状态

    [Android]保存Fragment切换状态 前言 一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法. 声明 欢迎转载,但请保留文章 ...

  6. 【Android】3.0 第3章 百度地图及其应用--预备知识

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.概述 这一章先来点有意思的百度地图应用示例,然后再分章详细介绍用C#开发Android App的各种基本技 ...

  7. 【Android】Vitamio 4.0 公测版发布(2013-05-28)

    更新 Vitamio 4.0 正式版已经发布! 这里:[Android]Vitamio 4.0 正式版发布/ Vitamio IOS 测试版发布(2013-07-16) 正文 一.下载地址 Vitam ...

  8. 【Android】Activity和PopupWindow都实现从底部弹出或滑出选择菜单或窗口

    使用Activity和PopupWindow都实现从底部弹出或滑出选择菜单或窗口 [Android]测试与popwindow PopupWindow转载自:Android PopupWindow实现从 ...

  9. 【Android】对话框 AlertDialog

    [Android]对话框 AlertDialog 本讲介绍一下Android基本组件:对话框AlertDialog. 来源:http://blog.csdn.net/feng88724/article ...

最新文章

  1. json字符串拼接 json_encode 数组带有花括号{}和中括号[]
  2. 更简单的非递归遍历二叉树的方法
  3. Artifactory——启动错误[Artifactory failed to initialize: check Artifactory logs for errors.]解决方案
  4. 开源开放 | 熵简科技 AI Lab 开源金融领域中文预训练语言模型 FinBERT
  5. hdu 5139 数据的离线处理
  6. Python机器学习:梯度下降法001什么是梯度下降法
  7. linux账号和权限管理思维导图,Linux系统支持的思维导图软件有哪些?
  8. html5+css3动画学习总结
  9. 如何删除档案中的重复的行
  10. XILINX FPGA数字信号处理——2、数字信号处理实现方法
  11. 利用sql循环语句实现基本的数据累加和阶乘
  12. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十二节--小结,Bootstrap Table之角色管理
  13. 20200525-生物技术-四川师范大学自考生物技术(本科)考试计划.txt
  14. 2018中国大学生程序设计竞赛 – 网络选拔赛 1001 Buy and Resell [模拟]
  15. 二极管对LDO的保护
  16. Linux获取纳秒级时间,WINDOW和LINXU下获取纳秒级时间精度
  17. 回溯法求解N皇后问题及其时间复杂度分析
  18. Halide::Generator生成器使用说明
  19. 微机原理与接口技术[第三版]——第五章课后习题答案
  20. 国外学术期刊出版社的论文搜索网址

热门文章

  1. 9+11个无版权、高清、免费图片素材网站给你!免费无版权可商用图标、图片素材,需要图片的时候可以上去看看
  2. DC/DC电源输入输出滤波电容摆放位置
  3. 短信验证码内容组成及设计注意事项
  4. 今天心情好,给各位免费呈上200兆SVN代码服务器一枚,不谢!
  5. 泛函分析笔记(二十一) 障碍问题
  6. 美森快船收费标准和操作流程是怎样的?
  7. HTTP 响应行及响应状态码
  8. 双非本科小渣渣的字节跳动Android岗面试题分享(已拿offer,分享攒人品~)
  9. 数学英语不好可以学计算机么,数学不好,英语不行,非计算机专业,可以学IT吗?...
  10. 【ACWing】587. 吃蛋糕