天天看点

Android Loader 异步加载详解二:探寻Loader内部机制Android Loader 异步加载详解二:探寻Loader内部机制

<a href="http://blog.csdn.net/zhaoyanjun6/article/details/70241844">Android Loader 异步加载详解一:基础概念</a>

<a href="http://blog.csdn.net/zhaoyanjun6/article/details/70259914">Android Loader 异步加载详解二:探寻Loader内部机制</a>

在上一篇文章中,讲解了 Loader 的基本概念。这一篇将会用实战的方式来探寻 Android Loader的内部机制。我们准备做一个 读取手机短信的例子。废话不多说,直接上效果图:

Android Loader 异步加载详解二:探寻Loader内部机制Android Loader 异步加载详解二:探寻Loader内部机制

首先 SmsActivity 的源码

activity_sms 布局

SmsLoader 类继承 AsyncTaskLoader

第一次 Activity 启动 Log 日志分析 :

可以看到 第一次调用 initLoader() 方法后

首先 调用 <code>LoaderCallbacks</code> 中的 <code>onCreateLoader</code> 来创建一个 Loader 对象,然后调用 <code>SmsLoader</code> 中的 <code>onStartLoading</code>方法。然后调用 <code>SmsLoader</code> 中的 <code>loadInBackground</code> 开始执行 异步任务。最后在 <code>LoaderCallbacks</code> 中 <code>onLoadFinished</code> 方法中回调。

点击 “开始执行 Init 方法” 按钮,Log 分析

点击 “开始执行 Init 方法”按钮后,开始执行

Log 日志为:

这里只回调了 <code>onLoadFinished</code> 的方法,把异步操作产生的数据给传递出来。请注意,这里没有走 <code>loadInBackground</code> 方法,说明此时 <code>onLoadFinished</code> 回传的数据,是旧数据,也就是上一次异步产生的数据。

但是有时我们想丢弃旧数据然后重新开始创建一个新Loader,这可怎么办呢?别担心,要丢弃旧数据调用restartLoader()即可。

restartLoader 方法探究。

点击 <code>开始查询按钮</code> ,会执行下面的代码

Log 日志:

通过日志可以看出 <code>restartLoader</code>重新执行了 <code>onCreateLoader</code> 创建了一个新的 <code>Loader</code> 对象; <code>loadInBackground</code> 丢弃了旧数据,重新加载了新数据 , 并且回调 <code>onLoadFinished</code> 。

当前 Activity 从后台到前台

在测试的时候,我发现当前 Activity 从后台到前台的时候,调用顺序如下:

可以看到当前界面从后台到前台的过程中,Loader 会自动调异步任务,并且回调新的数据。

当前 Activity 销毁

当前 Activity 销毁的时候,调用顺序如下:

可以看到 <code>LoaderCallbacks</code> 的 <code>onLoaderReset</code> 方法会回调。

当 <code>onLoaderReset</code> 方法被调用的时候,代表 这个 Loader 正在被重置,此时的数据不可用。应用程序应该在这一点上删除对Loader数据的任何引用。

比如:

<a href="https://developer.android.com/guide/components/loaders.html">官方文档</a>

<a href="http://hukai.me/android-training-course-in-chinese/background-jobs/load-data-background/setup-loader.html">使用CursorLoader执行查询任务</a>

<a href="http://blog.csdn.net/yanbober/article/details/48861457">Android应用Loaders全面详解及源码浅析</a>

<a href="http://wangkuiwu.github.io/2014/06/25/Loader/">Android之Loader介绍</a>

继续阅读