Android官方开发文档Training系列课程中文版:后台加载数据之使用CursorLoader进行查询
原文地址:http://android.xsoftlab.net/training/load-data-background/index.html
引言
在ContentProvider中查詢數(shù)據(jù)是需要花點時間的。如果你直接在Activity進行查詢,那么這可能會導致UI線程阻塞,并會引起”Application Not Responding”異常。就算不會發(fā)生這些事情,那么用戶也能感覺到卡頓,這會非常惱人的。為了避免這樣的問題,應該將查詢的工作放在單獨的線程中執(zhí)行,然后等待它執(zhí)行完畢后將結果顯示出來。
你可以使用一個異步查詢對象在后臺查詢,然后等查詢結束之后再與Activity建立連接。這個對象就是我們要說的CursorLoader。CursorLoader除了可以進行基本查詢之外,還可以在數(shù)據(jù)發(fā)生變化后自動的重新進行查詢。
這節(jié)課主要會學習如何使用CursorLoader在后臺進行查詢。
使用CursorLoader進行查詢
CursorLoader對象在后臺運行著一個異步查詢,當查詢結束之后會將結果返回到Activity或FragmentActivity。這使得查詢在進行的過程中Activity或FragmentActivity還可以繼續(xù)與用戶交互。
定義使用CursorLoader的Activity
如果要在Activity中使用CursorLoader,需要用到LoaderCallbacks接口。CursorLoader會調用該接口中的方法,從而使得與Activity產(chǎn)生交互。這節(jié)課與下節(jié)課都會詳細描述該接口中的回調。
舉個例子,下面的代碼演示了如何定義一個使用了CursorLoader的FragmentActivity。通過繼承FragmentActivity,你可以獲得CursorLoader對Fragment的支持:
public class PhotoThumbnailFragment extends FragmentActivity implementsLoaderManager.LoaderCallbacks<Cursor> { ... }初始化查詢
使用LoaderManager.initLoader()可以初始化查詢。它其實初始化了后臺查詢框架。可以將初始化這部分工作放在用戶輸入了需要查詢的數(shù)據(jù)之后,或者如果不需要用戶輸入數(shù)據(jù),那么也可以將這部分工作放在onCreate()或onCreateView()中執(zhí)行:
// Identifies a particular Loader being used in this componentprivate static final int URL_LOADER = 0;.../* When the system is ready for the Fragment to appear, this displays* the Fragment's View*/public View onCreateView(LayoutInflater inflater,ViewGroup viewGroup,Bundle bundle) {.../** Initializes the CursorLoader. The URL_LOADER value is eventually passed* to onCreateLoader().*/getLoaderManager().initLoader(URL_LOADER, null, this);...}Note: getLoaderManager()方法只對Fragment類可用。如果需要在FragmentActivity中獲得LoaderManager,調用getSupportLoaderManager()方法即可。
開始查詢
后臺查詢框架的初始化一旦完成,緊接著你所實現(xiàn)的onCreateLoader()就會被調用。如果要啟動查詢,需要在該方法內返回一個CursorLoader對象。你可以實例化一個空的CursorLoader,然后再使用它的方法定義查詢,或者你也可以在實例化CursorLoader的時候定義查詢。
/* * Callback that's invoked when the system has initialized the Loader and * is ready to start the query. This usually happens when initLoader() is * called. The loaderID argument contains the ID value passed to the * initLoader() call. */ @Override public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) {/** Takes action based on the ID of the Loader that's being created*/switch (loaderID) {case URL_LOADER:// Returns a new CursorLoaderreturn new CursorLoader(getActivity(), // Parent activity contextmDataUrl, // Table to querymProjection, // Projection to returnnull, // No selection clausenull, // No selection argumentsnull // Default sort order);default:// An invalid id was passed inreturn null;} }一旦后臺查詢框架獲得了該對象,那么它會馬上在后臺開始查詢。當查詢結果完成,后臺查詢框架會調用onLoadFinished(),該方法的具體內容會在下節(jié)課說明。
總結
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:后台加载数据之使用CursorLoader进行查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Theano+Keras开发环境搭建(最
- 下一篇: 我在小程序工程化方面的一些实践