大家好,我是苍王。
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表
相信有关注我的人,都会看过我上一编介绍的Todo-mvp源码体验,这是基础编。
这个系列的课程适合研发有Android有一年半左右的同学参考。
今天介绍的TODO-MVP-Loaders是Todo-mvp的进阶编。
可以对比一下这两个结构的图


对比两个图,可以看出会多出一个LOADER的加载模块,这个loader的作用是用来做什么呢?
loader是android 3.0后的一种异步数据加载机制,中文意思系加载器,可以理解为将我们想要的数据加载到一个相应的容器里面,即使Activity或者Fragment的周期中被打断,也不用利用的机制恢复现场,直接使用Loader的机制。
这里TODO-MVP-Loaders里面的设计关系图示

这里就是TaskLoader的触发运行原理了。每一个Activity/Fragment都有一个LoaderManager,而且只有这个LoaderManager可以管理与Actvity/Fragment相关联的Loader,Fragment调用的LoaderManager实际上也还是依附的Activity里面的。
LoaderManger生命周期和Activity和Fragment的生命周期是有关联的。
想深入了解LoaderManager和Loader生命周期,可以阅读深入源码解析Android中Loader、AsyncTaskLoader、CursorLoader、LoaderManager。
这个MVP的架构关键点当然就是loader了,很多入门不久的Android工程师,不一定会接触过loader。
从查看源码中我们可以看到里面调用TaskLoader

看一下Google官网对AsyncTaskLoader的介绍
If you need UI changes after data is loaded - AsyncTask might server you better, especially if you are working with fragments, but remember to handle activity configuration changes.
意思是说,你向数据加载完成之后ui改变,异步任务更适合,但是你需要写代码去处理activity的配置改变带来的影响
google文档中关于Loader的说法:
Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment. Loaders have these characteristics:
1、They are available to every Activity and Fragment. //支持Activity和Fragment
2、They provide asynchronous loading of data. //异步加载(就是异步任务来完成的)
3、They monitor the source of their data and deliver new results when the content changes. //当数据源改变时能及时通知客户端(自己特有的)
4、They automatically reconnect to the last loader’s cursor when being recreated after a configuration change. Thus, they don’t need to re-query their data. //发生configuration change时自动重连接(自己特有的)
查看里面的AsyncTaskLoader的源码,其继承于Loader,里面内部类是一个AsyncTask实现runnable的接口,用于单一任务,<D>用于基础的单一任务类,在TaskLoader里面是输入Task的对象。

图示如
TaskLoader是继承于的AsyncTaskLoader,然后AsyncTaskLoader包含了自己的AsyncTask,AsyncTaskLoader继承于Loader对象,而Activity/Fragment是通过LoaderManager来管理Loader。

首先构造函数中添加数据源的引用。其次重写如下方法
loadInBackground:主要是进行异步加载数据的,在其中,我将数据源的数据return出来了。

mRepostory上一节也有提到,是数据源获取的统一接口。TaskLoader初始化的时候也初始化。

deliverResult:则是真正的返回数据。

以下为一对。
onStartLoading:生命周期,在创建时成立。

onStopLoading:生命周期,在结束时调用。
onReset:重置

这里TaskLoader还加入了TasksRepository.TasksRepositoryObserver的接口onTasksChanged

那什么时候开始我们会启动我们的TaskLoader呢?
首先要加载LoaderManager

然后再Fragment onResume中初始化Presenter

然后通过LoaderManager.LoaderCallbacks创建loader使用自定义的TaskLoader

然后再onLoadFinished中加载已经完成的数据。

使用这个优势在于
1.可以异步加载数据,并监听数据变化。
2.LoaderManager是Activity/Fragment内置的,而且使用v4的库就可以兼容
3.就算Activity/Fragment发生configuration change时自动重连接
4.任务可以是使用对象封装
对TODO-MVP-Loaders的介绍就到这里
下一节,将会介绍todo-databinding,敬请期待!!!
我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习和架构思想的的交流。
群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

网友评论