處理查詢的結果

編寫:kesenhoo - 原文:http://developer.android.com/training/load-data-background/handle-results.html

正如前面一節課講到的,你應該在 onCreateLoader()的回調裡面使用CursorLoader執行加載數據的操作。Loader查詢完後會調用Activity或者FragmentActivity的LoaderCallbacks.onLoadFinished()將結果回調回來。這個回調方法的參數之一是Cursor,它包含了查詢的數據。你可以使用Cursor對象來更新需要顯示的數據或者進行下一步的處理。

除了onCreateLoader()onLoadFinished(),你也需要實現onLoaderReset()。這個方法在CursorLoader檢測到Cursor上的數據發生變化的時候會被觸發。當數據發生變化時,系統也會觸發重新查詢的操作。

處理查詢結果

為了顯示CursorLoader返回的Cursor數據,需要使用實現AdapterView的視圖組件,,併為這個組件綁定一個實現了CursorAdapter的Adapter。系統會自動把Cursor中的數據顯示到View上。

你可以在顯示數據之前建立View與Adapter的關聯。然後在onLoadFinished()的時候把Cursor與Adapter進行綁定。一旦你把Cursor與Adapter進行綁定之後,系統會自動更新View。當Cursor上的內容發生改變的時候,也會觸發這些操作。

例如:

public String[] mFromColumns = {
    DataProviderContract.IMAGE_PICTURENAME_COLUMN
};
public int[] mToFields = {
    R.id.PictureName
};
// Gets a handle to a List View
ListView mListView = (ListView) findViewById(R.id.dataList);
/*
 * Defines a SimpleCursorAdapter for the ListView
 *
 */
SimpleCursorAdapter mAdapter =
    new SimpleCursorAdapter(
            this,                // Current context
            R.layout.list_item,  // Layout for a single row
            null,                // No Cursor yet
            mFromColumns,        // Cursor columns to use
            mToFields,           // Layout fields to use
            0                    // No flags
    );
// Sets the adapter for the view
mListView.setAdapter(mAdapter);
...
/*
 * Defines the callback that CursorLoader calls
 * when it's finished its query
 */
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    ...
    /*
     * Moves the query results into the adapter, causing the
     * ListView fronting this adapter to re-display
     */
    mAdapter.changeCursor(cursor);
}

刪除廢舊的Cursor引用

當Cursor失效的時候,CursorLoader會被重置。這通常發生在Cursor相關的數據改變的時候。在重新執行查詢操作之前,系統會執行你的onLoaderReset()回調方法。在這個回調方法中,你應該刪除當前Cursor上的所有數據,避免發生內存洩露。一旦onLoaderReset()執行結束,CursorLoader就會重新執行查詢操作。

例如:

/*
 * Invoked when the CursorLoader is being reset. For example, this is
 * called if the data in the provider changes and the Cursor becomes stale.
 */
@Override
public void onLoaderReset(Loader<Cursor> loader) {

    /*
     * Clears out the adapter's reference to the Cursor.
     * This prevents memory leaks.
     */
    mAdapter.changeCursor(null);
}


书籍推荐