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

RxJava2 学习资料_第1张图片
Paste_Image.png

极客日报

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

https://github.com/codeestX/GeekNews

RxJava2 学习资料_第2张图片
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 combiNotification(List n1, 
List 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() {                    
                  @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 许可协议。转载请注明出处!

你可能感兴趣的:(RxJava2 学习资料)