天天看點

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>

繼續閱讀