RxJava 从入门到放弃再到不离不弃

作者寄语 很久之前就想写一个专题,专写Android开发框架,专题的名字叫 XXX 从入门到放弃 ,沉淀了这么久,看过网络诸多大神的博客,静下心来开始写这个专题,为什么叫入门到放弃呢;相信大家学习新框架的时候,尤其是像Rxjava或者Dagger等等这种新的编程思想;需要一定的阅读理解能力和思维逻辑;那么本专题旨在帮助大家不要太过急功近利,不要被冗长的代码和文章,晦涩的思想所打败,相信大家只要坚持看完,一定会有所收获的;废话不多说,那么这个专题开篇就以RxJava来讲吧,预计后面还会有几篇大型框架的讲解,想想还有点小激动; 友情提示:文章较长,请耐心看完; 前言 RxJava等编程思想正在Android开发者中变的越来越流行。唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言。 首先要先理清这么一个问题:Rxjava和我们平时写的程序有什么不同。相信稍微对Rxjava有点认知的朋友都会深深感受到用这种方式写的程序和我们一般写的程序有很明显的不同。我们一般写的程序 统称为命令式程序,是以流程为核心的,每一行代码实际上都是机器实际上要执行的指令。而Rxjava这样的编程风格,称为函数响应式编程。函数响应式编程是以数据流为核心,处理数据的输入,处理以及输出的。这种思路写出来的代码就会跟机器实际执行的指令大相径庭。所以对于已经习惯命令式编程的我们来说,刚开始接触Rxjava的时候必然会很不适应,而且也不太符合我们平时的思维习惯。但是久而久之你会发现这个框架的精髓,尤其是你运用到大项目中的时候,简直爱不释手,随着程序逻辑变得越来越复杂,它依然能够保持代码简洁。 RxJava是什么 a library for composing asynchronous and event-based programs using observable sequences for the Java VM 解释:一个对于构成使用的Java虚拟机观察序列异步和基于事件的程序库 RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。 RxJava 是一个开源项目,地址:https://github.com/ReactiveX/RxJava RxAndroid,用于 Android 开发,添加了 Android 用的接口。地址: https://github.com/ReactiveX/RxAndroid 基本概念 网上关于RxJava的博文也有很多,我也看过许多,其中不乏有优秀的文章,但绝大部分文章都有一个共同点,就是侧重于讲RxJava中各种强大的操作符,而忽略了最基本的东西——概念,所以一开始我也看的一脸懵逼,看到后面又忘了前面的,脑子里全是问号,这个是什么,那个又是什么,这两个长得怎么那么像。举个不太恰当的例子,概念之于初学者,就像食物之于人,当你饿了,你会想吃面包、牛奶,那你为什么不去吃土呢,因为你知道面包牛奶是用来干嘛的,土是用来干嘛的。同理,前面已经说过,RxJava无非是发送数据与接收数据,那么什么是发射源,什么是接收源,这就是你应该明确的事,也是RxJava的入门条件之一,下面就依我个人理解,对发射源和接收源做个归类,以及RxJava中频繁出现的几个“单词”解释一通; Observable:发射源,英文释义“可观察的”,在观察者模式中称为“被观察者”或“可观察对象”; Observer:接收源,英文释义“观察者”,没错!就是观察者模式中的“观察者”,可接收Observable、Subject发射的数据; Subject:Subject是一个比较特殊的对象,既可充当发射源,也可充当接收源,为避免初学者被混淆,本章将不对Subject做过多的解释和使用,重点放在Observable和Observer上,先把最基本方法的使用学会,后面再学其他的都不是什么问题; Subscriber:“订阅者”,也是接收源,那它跟Observer有什么区别呢?Subscriber实现了Observer接口,比Observer多了一个最重要的方法unsubscribe( ),用来取消订阅,当你不再想接收数据了,可以调用unsubscribe( )方法停止接收,Observer 在 subscribe() 过程中,最终也会被转换成 Subscriber 对象,一般情况下,建议使用Subscriber作为接收源; Subscription :Observable调用subscribe( )方法返回的对象,同样有unsubscribe( )方法,可以用来取消订阅事件; Action0:RxJava中的一个接口,它只有一个无参call()方法,且无返回值,同样还有Action1,Action2…Action9等,Action1封装了含有 1 个参的call()方法,即call(T t),Action2封装了含有 2 个参数的call方法,即call(T1 t1,T2 t2),以此类推; Func0:与Action0非常相似,也有call()方法,但是它是有返回值的,同样也有Func0、Func1…Func9; RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件。这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据…) ...

2018年4月28日 · 15 分钟 · 天边的星星

给 Android 开发者的 RxJava 详解

前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用过程中对 RxJava 有了一些理解,我决定写下这篇文章来对 RxJava 做一个相对详细的、针对 Android 开发者的介绍。 这篇文章的目的有两个: 给对 RxJava 感兴趣的人一些入门的指引 给正在使用 RxJava 但仍然心存疑惑的人一些更深入的解析 - [RxJava 到底是什么](http://gank.io/post/560e15be2dca930e00da1083#toc_1) - [RxJava 好在哪](http://gank.io/post/560e15be2dca930e00da1083#toc_2) - [API 介绍和原理简析](http://gank.io/post/560e15be2dca930e00da1083#toc_3) - [1. 概念:扩展的观察者模式](http://gank.io/post/560e15be2dca930e00da1083#toc_4) - [观察者模式](http://gank.io/post/560e15be2dca930e00da1083#toc_5) - [RxJava 的观察者模式](http://gank.io/post/560e15be2dca930e00da1083#toc_6) - [2. 基本实现](http://gank.io/post/560e15be2dca930e00da1083#toc_7) - [1) 创建 Observer](http://gank.io/post/560e15be2dca930e00da1083#toc_8) - [2) 创建 Observable](http://gank.io/post/560e15be2dca930e00da1083#toc_9) - [3) Subscribe (订阅)](http://gank.io/post/560e15be2dca930e00da1083#toc_10) - [4) 场景示例](http://gank.io/post/560e15be2dca930e00da1083#toc_11) - [a. 打印字符串数组](http://gank.io/post/560e15be2dca930e00da1083#toc_12) - [b. 由 id 取得图片并显示](http://gank.io/post/560e15be2dca930e00da1083#toc_13) - [3. 线程控制 —— Scheduler (一)](http://gank.io/post/560e15be2dca930e00da1083#toc_14) - [1) Scheduler 的 API (一)](http://gank.io/post/560e15be2dca930e00da1083#toc_15) - [2) Scheduler 的原理 (一)](http://gank.io/post/560e15be2dca930e00da1083#toc_16) - [4. 变换](http://gank.io/post/560e15be2dca930e00da1083#toc_17) - [1) API](http://gank.io/post/560e15be2dca930e00da1083#toc_18) - [2) 变换的原理:lift()](http://gank.io/post/560e15be2dca930e00da1083#toc_19) - [3) compose: 对 Observable 整体的变换](http://gank.io/post/560e15be2dca930e00da1083#toc_20) - [5. 线程控制:Scheduler (二)](http://gank.io/post/560e15be2dca930e00da1083#toc_21) - [1) Scheduler 的 API (二)](http://gank.io/post/560e15be2dca930e00da1083#toc_22) - [2) Scheduler 的原理(二)](http://gank.io/post/560e15be2dca930e00da1083#toc_23) - [3) 延伸:doOnSubscribe()](http://gank.io/post/560e15be2dca930e00da1083#toc_24) - [RxJava 的适用场景和使用方式](http://gank.io/post/560e15be2dca930e00da1083#toc_25) - [1. 与 Retrofit 的结合](http://gank.io/post/560e15be2dca930e00da1083#toc_26) - [2. RxBinding](http://gank.io/post/560e15be2dca930e00da1083#toc_27) - [3. 各种异步操作](http://gank.io/post/560e15be2dca930e00da1083#toc_28) - [4. RxBus](http://gank.io/post/560e15be2dca930e00da1083#toc_29) - [最后](http://gank.io/post/560e15be2dca930e00da1083#toc_30) - [关于作者:](http://gank.io/post/560e15be2dca930e00da1083#toc_31) - [为什么写这个?](http://gank.io/post/560e15be2dca930e00da1083#toc_32) 在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid 引入依赖: compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1' (版本号是文章发布时的最新稳定版) ...

2016年1月20日 · 25 分钟 · 天边的星星