1. 前言
今天咱们继续,看下todo-mvp-rxjava分支与todo-mvp-loaders分支。rxjava分支引入了很火的rxjava。loaders分支引入了3.0就加入进来的Loader框架。
2. rxjava分支
不知道大家有没有用rxjava,rxjava用起来真的很不错,尤其是用rxandroid做线程调度的时候,配合上RxAndroid 全家桶,真的爽翻了。
虽然说rxjava的操作符有很多,不多我们平常开发用到的却不多,很多前辈都给我们总结了许多RxJava的应用场景。好了,废话就到这里,咱们来看看todo-mvp-rxjava分支的不同之处。
todo-mvp-rxjava 与todo-mvp的区别就在与Model层(Repository)的数据处理部分。
还是以TasksRepository#getTask 为例。代码如下。
mTasksRepository#getTask 返回一个Observable对象,并发射数据,在onNext和onComlpeted中调用View的接口去更新UI。那么我们来看下getTask的代码。
- 从缓存中取数据,并用just操作符生成一个Observable对象
- 分别从loacl 和remote数据源中返回一个Observable,然后用concat结合两个observable等等。
可以看到,这里就是用rxjava来操作。好,暂时就到这里了。
3. loaders
看下github上对应的架构图。
从图中可以看到,多出了Loader,这个从3.0引入的,用于在Activity或Fragment中异步加载数据。Loader Guide
仔细观察图中Loader相关的箭头可以看的出。
- 我们可以通过Loader充当M 与VP之间的桥梁,通过Loader调用Repository去获取处理数据,也可以更新UI。
我们先观察TaskDetailPresenter构造函数的变化。需要注意的是,TaskDetailPresenter实现了LoaderManager.LoaderCallbacks接口。
多出了以下内容
- Loader的实现 TaskLoader
- LoaderManager
,在Fragment的onResume中,会调用Presenter的start方法。而在这个方法中,调用LoderManager的initLoader方法。然后会在TaskLoader的loadInBackground方法中进行加载数据。
而getTask方法就是获取数据的,这里就不在说了,然后就会调用LoaderCallbacks中的onLoadFinished方法,也就是Presenter中的onLoadFinished方法。
最后,更新UI。流程到这里就结束了。