Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android官方開發文檔Training系列課程中文版:後台加載數據之使用CursorLoader進行查詢

Android官方開發文檔Training系列課程中文版:後台加載數據之使用CursorLoader進行查詢

編輯:關於Android編程

引言

在ContentProvider中查詢數據是需要花點時間的。如果你直接在Activity進行查詢,那麼這可能會導致UI線程阻塞,並會引起”Application Not Responding”異常。就算不會發生這些事情,那麼用戶也能感覺到卡頓,這會非常惱人的。為了避免這樣的問題,應該將查詢的工作放在單獨的線程中執行,然後等待它執行完畢後將結果顯示出來。

你可以使用一個異步查詢對象在後台查詢,然後等查詢結束之後再與Activity建立連接。這個對象就是我們要說的CursorLoader。CursorLoader除了可以進行基本查詢之外,還可以在數據發生變化後自動的重新進行查詢。

這節課主要會學習如何使用CursorLoader在後台進行查詢。

使用CursorLoader進行查詢

CursorLoader對象在後台運行著一個異步查詢,當查詢結束之後會將結果返回到Activity或FragmentActivity。這使得查詢在進行的過程中Activity或FragmentActivity還可以繼續與用戶交互。

定義使用CursorLoader的Activity

如果要在Activity中使用CursorLoader,需要用到LoaderCallbacks接口。CursorLoader會調用該接口中的方法,從而使得與Activity產生交互。這節課與下節課都會詳細描述該接口中的回調。

舉個例子,下面的代碼演示了如何定義一個使用了CursorLoader的FragmentActivity。通過繼承FragmentActivity,你可以獲得CursorLoader對Fragment的支持:

public class PhotoThumbnailFragment extends FragmentActivity implements
        LoaderManager.LoaderCallbacks {
...
}

初始化查詢

使用LoaderManager.initLoader()可以初始化查詢。它其實初始化了後台查詢框架。可以將初始化這部分工作放在用戶輸入了需要查詢的數據之後,或者如果不需要用戶輸入數據,那麼也可以將這部分工作放在onCreate()或onCreateView()中執行:

    // Identifies a particular Loader being used in this component
    private 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()方法即可。

開始查詢

後台查詢框架的初始化一旦完成,緊接著你所實現的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 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 CursorLoader
            return new CursorLoader(
                        getActivity(),   // Parent activity context
                        mDataUrl,        // Table to query
                        mProjection,     // Projection to return
                        null,            // No selection clause
                        null,            // No selection arguments
                        null             // Default sort order
        );
        default:
            // An invalid id was passed in
            return null;
    }
}

一旦後台查詢框架獲得了該對象,那麼它會馬上在後台開始查詢。當查詢結果完成,後台查詢框架會調用onLoadFinished(),該方法的具體內容會在下節課說明。

原文地址:http://android.xsoftlab.net/training/load-data-background/index.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved