你们好,我是苍王。
html
如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。android
[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表架构
相信有关注个人人,都会看过我上一编介绍的Todo-mvp源码体验,这是基础编。app
这个系列的课程适合研发有Android有一年半左右的同窗参考。异步
今天介绍的TODO-MVP-Loaders是Todo-mvp的进阶编。async
能够对比一下这两个结构的图ide
对比两个图,能够看出会多出一个LOADER的加载模块,这个loader的做用是用来作什么呢?函数
loader是android 3.0后的一种异步数据加载机制,中文意思系加载器,能够理解为将咱们想要的数据加载到一个相应的容器里面,即便Activity或者Fragment的周期中被打断,也不用利用的机制恢复现场,直接使用Loader的机制。组件化
这里TODO-MVP-Loaders里面的设计关系图示post
这里就是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:
一、They are available to every Activity and Fragment. //支持Activity和Fragment
二、They provide asynchronous loading of data. //异步加载(就是异步任务来完成的)
三、They monitor the source of their data and deliver new results when the content changes. //当数据源改变时能及时通知客户端(本身特有的)
四、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,也能够扫码进群。我在这里期待大家的加入!!!