比如有这么一个需求:网络上下载一张图片,然后显示在界面上。常规的做法可能就是开一个子线程负责网络图片的下载,得到图片后,通过Handler发送到UI线程进行界面的更新。这样写,当然也没有问题,但是,这样会显得代码四分五裂,可读性不是很强。但是通过rxjava的链式调用以及线程切换,这样的需求同样能够实现,并且代码的阅读性很强。
一、线程模式
1、四种线程模式
- Schedulers.io(): io流操作,网络操作,文件流,耗时操作等异步操作
- Schedulers.newThread():比较常规的异步线程
- Schedulers.computation():需要cpu大量计算的线程
- AndroidSchedulers.mainThread():专供android切换到主线程
以上4种模式,io()和mainThread()模式是比较常用的。下面代码测试上游和下游线程的切换
2、线程切换
测试代码如下:
代码中上游多次切换线程,下游也多次切换线程。测试结果如下:
结果发现,上游保持在主线程,下游也在主线程。所以可以得出2个结论:
- 上游线程切换,可以切换多次,以第一次为准;下游线程切换,可以切换多次,以最后一次为准。
- 上游使用 subscribeOn() 切换线程,下游使用 observeOn() 切换线程。
二、网络下载图片
了解到线程切换的原理,下面使用rxjava实现网络下载图片,并且显示到UI界面上。
1、图片地址
2、rxjava下载、并显示图片
使用过程中需要将上游切换到异步线程,下载完成后,需要将下游线程切换到主线程,最后在onNext()方法中显示图片。