TODO-MVP-Loaders源码体验

大家好,我是苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

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

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

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

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

可以对比一下这两个结构的图

《TODO-MVP-Loaders源码体验》 todo-mvp架构图
《TODO-MVP-Loaders源码体验》 todo-mvp-loaders架构图

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

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

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

《TODO-MVP-Loaders源码体验》 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

《TODO-MVP-Loaders源码体验》 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的对象。

《TODO-MVP-Loaders源码体验》

图示如

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

《TODO-MVP-Loaders源码体验》

首先构造函数中添加数据源的引用。其次重写如下方法

loadInBackground:主要是进行异步加载数据的,在其中,我将数据源的数据return出来了。

《TODO-MVP-Loaders源码体验》

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

《TODO-MVP-Loaders源码体验》

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

《TODO-MVP-Loaders源码体验》

以下为一对。

onStartLoading:生命周期,在创建时成立。

《TODO-MVP-Loaders源码体验》

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

onReset:重置

《TODO-MVP-Loaders源码体验》

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

《TODO-MVP-Loaders源码体验》

那什么时候开始我们会启动我们的TaskLoader呢?

首先要加载LoaderManager

《TODO-MVP-Loaders源码体验》

然后再Fragment onResume中初始化Presenter

《TODO-MVP-Loaders源码体验》

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

《TODO-MVP-Loaders源码体验》

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

《TODO-MVP-Loaders源码体验》

使用这个优势在于

1.可以异步加载数据,并监听数据变化。

2.LoaderManager是Activity/Fragment内置的,而且使用v4的库就可以兼容

3.就算Activity/Fragment发生configuration change时自动重连接

4.任务可以是使用对象封装

对TODO-MVP-Loaders的介绍就到这里

下一节,将会介绍todo-databinding,敬请期待!!!

我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习和架构思想的的交流。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

《TODO-MVP-Loaders源码体验》

    原文作者:CangWang
    原文地址: https://www.jianshu.com/p/180491e2264c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞