admin 发表于 2017-5-12 10:01:55

给 Android 开发者的 RxJava 详解

前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么?鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用过程中对 RxJava 有了一些理解,我决定写下这篇文章来对 RxJava 做一个相对详细的、针对 Android 开发者的介绍。这篇文章的目的有两个: 1. 给对 RxJava 感兴趣的人一些入门的指引 2. 给正在使用 RxJava 但仍然心存疑惑的人一些更深入的解析
[*]RxJava 到底是什么
[*]RxJava 好在哪
[*]API 介绍和原理简析
[*]1. 概念:扩展的观察者模式
[*]观察者模式
[*]RxJava 的观察者模式

[*]2. 基本实现
[*]1) 创建 Observer
[*]2) 创建 Observable
[*]3) Subscribe (订阅)
[*]4) 场景示例
[*]a. 打印字符串数组
[*]b. 由 id 取得图片并显示


[*]3. 线程控制 —— Scheduler (一)
[*]1) Scheduler 的 API (一)
[*]2) Scheduler 的原理 (一)

[*]4. 变换
[*]1) API
[*]2) 变换的原理:lift()
[*]3) compose: 对 Observable 整体的变换

[*]5. 线程控制:Scheduler (二)
[*]1) Scheduler 的 API (二)
[*]2) Scheduler 的原理(二)
[*]3) 延伸:doOnSubscribe()


[*]RxJava 的适用场景和使用方式
[*]1. 与 Retrofit 的结合
[*]2. RxBinding
[*]3. 各种异步操作
[*]4. RxBus

[*]最后
[*]关于作者:
[*]为什么写这个?


在正文开始之前的最后,放上 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'
(版本号是文章发布时的最新稳定版)另外,感谢 RxJava 核心成员流火枫林的技术支持和内测读者代码家、鲍永章、drakeet、马琳、有时放纵、程序亦非猿、大头鬼、XZoomEye、席德雨、TCahead、Tiiime、Ailurus、宅学长、妖孽、大大大大大臣哥、NicodeLee的帮助,以及周伯通招聘的赞助。RxJava 到底是什么一个词:异步。RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。然而,对于初学者来说,这太难看懂了。因为它是一个『总结』,而初学者更需要一个『引言』。其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。RxJava 好在哪换句话说,『同样是做异步,为什么人们用它,而不用现成的 AsyncTask / Handler / XXX / ... ?』一个词:简洁。异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。http://ww4.sinaimg.cn/large/52eb2279jw1f2rx409pcnj2044048mx5.jpg假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,我这里贴出其中一种:
原文地址:http://gank.io/post/560e15be2dca930e00da1083

页: [1]
查看完整版本: 给 Android 开发者的 RxJava 详解