RxJava2 学习资料

仅作学习资料收集,请勿转载,如需转载请联系原作者

原创 2017-09-01 鸿洋 鸿洋
昨天给大家推荐的巨大福利来袭,还记得去年的那个“玩Android”网站么?(可点击访问)

最近在看RxJava相关的文章,同事之前也做过一些分享,RxJava用起来还是非常爽的,尤其是一个页面需要多个网络请求,在控制这些访问请求顺序、并发请求、失败重试、token生效等。

当前了,因为现在是已经更新到RxJava2了,所以本篇主要目前是RxJava2学习资源的推荐,后面有机会会针对各种场景写一篇实战类的文章。

先贴几个必要的地址,以及wiki:

https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
https://github.com/JakeWharton/RxBinding
https://github.com/JakeWharton/RxRelay
https://github.com/ReactiveX/RxJava/wiki/Additional-Reading

可以在看完下面的入门资料后,细细的看下官方的相关文章。

1、0基础到上手

这个非常推荐简书作者Season_zlc的“水管”系列,相信很多人都看过,看完你就知道为什么叫“水管”系列了~~

给初学者的RxJava2.0教程(一)

http://www.jianshu.com/p/464fa025229e

给初学者的RxJava2.0教程(二)

http://www.jianshu.com/p/8818b98c44e2

给初学者的RxJava2.0教程(三)

http://www.jianshu.com/p/128e662906af

给初学者的RxJava2.0教程(四)

http://www.jianshu.com/p/bb58571cdb64

给初学者的RxJava2.0教程(五)

http://www.jianshu.com/p/0f2d6c2387c9

给初学者的RxJava2.0教程(六)

http://www.jianshu.com/p/e4c6d7989356

给初学者的RxJava2.0教程(七)

http://www.jianshu.com/p/9b1304435564

给初学者的RxJava2.0教程(八)

http://www.jianshu.com/p/a75ecf461e02

给初学者的RxJava2.0教程(九)

http://www.jianshu.com/p/36e0f7f43a51


贴个二维码可以直达。

接下来还有简书作者南尘2251的RxJava2系列。

这可能是最好的RxJava 2.x 入门教程(一)

http://www.jianshu.com/p/a93c79e9f689

这可能是最好的RxJava 2.x 入门教程(二)

http://www.jianshu.com/p/b39afa92807e

这可能是最好的RxJava 2.x 入门教程(三)

http://www.jianshu.com/p/e9c79eacc8e3

这可能是最好的RxJava 2.x 入门教程(四)

http://www.jianshu.com/p/c08bfc58f4b6

这可能是最好的RxJava 2.x 入门教程(五)

http://www.jianshu.com/p/81fac37430dd

GitHub 代码同步更新:
https://github.com/nanchen2251/RxJava2Examples

完结版刚好本公众号推送过,可以直接过去这可能是最好的 RxJava 2.x 入门教程(完结版)~

基本上看完就已经对RxJava2有一定的了解了,接下来就是异常强大的操作符的学习了~

2.操作符与实战

CSDN作者余志强的RxJava2操作符系列:

RxJava create操作符的用法和源码分析

http://blog.csdn.net/johnny901114/article/details/51524470

RxJava map操作符用法详解

http://blog.csdn.net/johnny901114/article/details/51531348

RxJava flatMap操作符用法详解

http://blog.csdn.net/johnny901114/article/details/51532776

RxJava concatMap操作符用法详解

http://blog.csdn.net/johnny901114/article/details/51533282

RxJava onErrorResumeNext操作符实现app与服务器间token机制

http://blog.csdn.net/johnny901114/article/details/51533586

RxJava retryWhen操作符实现错误重试机制

http://blog.csdn.net/johnny901114/article/details/51539708

RxJava 使用debounce操作符优化app搜索功能

http://blog.csdn.net/johnny901114/article/details/51555203

RxJava concat操作处理多数据源

http://blog.csdn.net/johnny901114/article/details/51568562

RxJava zip操作符在Android中的实际使用场景

http://blog.csdn.net/johnny901114/article/details/51614927

RxJava switchIfEmpty操作符实现Android检查本地缓存逻辑判断

http://blog.csdn.net/johnny901114/article/details/52585912

RxJava defer操作符实现代码支持链式调用

http://blog.csdn.net/johnny901114/article/details/52597643

combineLatest操作符的高级使用

http://blog.csdn.net/johnny901114/article/details/61191723

还有个非常给力的开源项目,“Learn RxJava By Samples”:

https://github.com/amitshekhariitbhu/RxJava2-Android-Samples

包含非常多的Sample,你也可以在它的README上获得更多信息~

该篇是对该项目的记录,方便速查:

RxJava 知识梳理(2) - RxJava2 操作符实践

http://www.jianshu.com/p/2ddd9bb8b1d7

该作者最近也在写一些实战类的文章:

RxJava2 实战知识梳理(1) - 后台执行耗时操作,实时通知 UI 更新

http://www.jianshu.com/p/c935d0860186

RxJava2 实战知识梳理(2) - 计算一段时间内数据的平均值

http://www.jianshu.com/p/5dd01b14c02a

RxJava2 实战知识梳理(3) - 优化搜索联想功能

http://www.jianshu.com/p/7995497baff5

RxJava2 实战知识梳理(4) - 结合 Retrofit 请求新闻资讯

http://www.jianshu.com/p/74f46ae1fabb

RxJava2 实战知识梳理(5) - 简单及进阶的轮询操作

http://www.jianshu.com/p/fa1828d70192

RxJava2 实战知识梳理(6) - 基于错误类型的重试请求

http://www.jianshu.com/p/d135f19e045c

RxJava2 实战知识梳理(7) - 基于 combineLatest 实现的输入表单验证

http://www.jianshu.com/p/25682d620320

RxJava2 实战知识梳理(8) - 使用 publish + merge 优化先加载缓存,再读取网络数据的请求过程

http://www.jianshu.com/p/dfc11118b70b

3开源项目

优秀的项目很多推荐2个太多了也看不完~

就看天气

就看天气——是一款遵循 Material Design 风格的只看天气的APP。

  • 卡片展现(当前天气情况,未来几小时天气情况,生活建议,一周七天概况)

  • 缓存数据,减少网络请求,保证离线查看

  • 内置两套图标(设置里更改)

https://github.com/xcc3641/SeeWeather

Paste_Image.png

极客日报

极客日报,一款纯粹的阅读App,基于Material Design + MVP + RxJava2 + Retrofit + Dagger2 + Realm + Glide
出于学习的目的做了这款Material Design风格的简洁的阅读应用,基本涵盖了当前Android端开发最常用的主流框架,阅读内容主要面向程序员/极客,目前包括:
知乎日报、微信精选、干货集中营、稀土掘金、V2EX

https://github.com/codeestX/GeekNews

Paste_Image.png

4 源码解析

推荐下张旭童的博客相信关注本公众号的很多都看过旭童的文章

RxJava2 源码解析(一)

http://blog.csdn.net/zxt0601/article/details/61614799

RxJava2 源码解析(二)

http://blog.csdn.net/zxt0601/article/details/61637439

5.适用场景

[本文作者: 阳春面 本文链接: http://appkfz.com/2017/09/01/best-scene-use-rxjava/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!]

下面我们开始介绍RxJava最适合使用的四种场景,代码示例基于RxJava1

场景一: 单请求异步处理

由于在Android UI线程中不能做一些耗时操作,比如网络请求,大文件保存等,所以在开发中经常会碰到异步处理的情况,我们最典型的使用场景是RxJava+Retrofit处理网络请求

MyService myService = retrofit.create(MyService.class);
myService.getSomething()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);

为了使代码看起来简洁点,这边还使用了lambda表达式, 
updateUI和 showError需要在当前类中实现,比如:

public void updateUI(Data data){      
//TODO something
}
public void showError(throwable t){      
//show error msg
}

场景二: 多异步请求连续调用

这种场景其实也很常见,我们做用户头像编辑的使用,一般就会有三个请求需要连续调用:

请求头像上传的地址
上传头像
更新用户信息
在平时的代码里,我们需要一步步callback嵌套下来,代码冗长太难看,而且不好维护,使用RxJava链式调用处理代码逻辑就会非常清晰

Observable.just(1)
  .map(this::task1)
  .map(this::task2)
  .map(this::task3)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(this::updateUI,this::showError);
这里的just发送的固定值1,没有实际意义,
只是我觉得这样更信息 你也可以用Observable.create创建observable。

场景三: 多异步请求合并处理

有时候在项目中,我们会碰到组合多个请求的结果后,再更新UI的情况,比如我们项目中就有一个从多个请求地址获取通知数据,然后在APP上再按时间顺序组合后展示的需求,这时候我们就可以用RxJava的zip函数来处理了

MyService myService = retrofit.create(MyService.class);
Observable o1 = myService.getNotification1();
Observable o2 = myService.getNotification2();
Observable.zip(o1,o2, this::combiNotification)
             .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI,this::showError);
public List<Notification> combiNotification(List<Notification> n1, 
List<Notification> n2){      
//TODO 合并通知列表
}
zip函数会等待两个请求都完成后,调用我们的合并方法combiNotification,等合并处理后再回调subscribe中的方法。

场景四: 定时轮询

RxJava还特别适合对定时轮询任务的处理, 一种典型的例子就是APP提交了一个任务给后台异步处理,假设后台处理需要1-2分钟左右,我们需要定时到后台查询进度,并更新到UI上, 传统的做法是用Handler的postDelay方法,用RxJava实现的话就会非常简洁

Subscription subscription =  Observable.interval(2, TimeUnit.SECONDS)
                .map(this::getProgress)
               .takeUntil(progress -> progress !=  100)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Long>() {                    
                  @Override
                  public void onCompleted() {                       
                  //TODO finished                    }
                    
                 @Override
                 publi void onError(Throwable e) {                    }
                    
                 @Override       
                 public void onNext(int progress) {                         
                //TODO update progress
                    }
                });
我们以定时2秒查询一次,直到进度progress=100为止,自动终止轮询。

以上各种RxJava方法都是异步耗时调用,考虑到Activity的退出时请求还没有完成,我们需要在Activity的OnDestroy方法中取消RxJava调用

subscription.unsubscribe();

本文作者: 阳春面本文链接: http://appkfz.com/2017/09/01/best-scene-use-rxjava/版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容