TODO-MVP-Loaders源码体验

你们好,我是苍王。
html

如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。android

[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表架构

相信有关注个人人,都会看过我上一编介绍的Todo-mvp源码体验,这是基础编。app

这个系列的课程适合研发有Android有一年半左右的同窗参考。异步

今天介绍的TODO-MVP-Loaders是Todo-mvp的进阶编。async

能够对比一下这两个结构的图ide


todo-mvp架构图

todo-mvp-loaders架构图

对比两个图,能够看出会多出一个LOADER的加载模块,这个loader的做用是用来作什么呢?函数

loader是android 3.0后的一种异步数据加载机制,中文意思系加载器,能够理解为将咱们想要的数据加载到一个相应的容器里面,即便Activity或者Fragment的周期中被打断,也不用利用的机制恢复现场,直接使用Loader的机制。组件化

这里TODO-MVP-Loaders里面的设计关系图示post


loaderManager图示

这里就是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


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,也能够扫码进群。我在这里期待大家的加入!!!

相关文章
相关标签/搜索