仅作学习资料收集,请勿转载,如需转载请联系原作者
原创 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
极客日报
极客日报,一款纯粹的阅读App,基于Material Design + MVP + RxJava2 + Retrofit + Dagger2 + Realm + Glide
出于学习的目的做了这款Material Design风格的简洁的阅读应用,基本涵盖了当前Android端开发最常用的主流框架,阅读内容主要面向程序员/极客,目前包括:
知乎日报、微信精选、干货集中营、稀土掘金、V2EX
https://github.com/codeestX/GeekNews
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 许可协议。转载请注明出处!