<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的内部机制。我们准备做一个 读取手机短信的例子。废话不多说,直接上效果图:

首先 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>