Activity 后台载入数据

如果直接的 在一个 ContentProvider 中搜索想要显示的数据,那么需要花费很多时间,很有可能造成卡顿,ANR

你也可以异步的在后台 用一个对象 来载入 然后当完成的时候 在重新和你的 Activity 建立联系

我们使用的对象就是 CursorLoader ,CursorLoader 可以在数据变更的时候,自动的重新运行

CursorLoader 在 v4 的支持库中

使用CursorLoader中来运行一个Query

定一个要使用 CursorLoader 的 Activity

如果要使用 CursorLoader,必须实现LoaderCallbacks<Cursor> 的接口,如下:

public class PhotoThumbnailFragment extends FragmentActivity implements
        LoaderManager.LoaderCallbacks<Cursor> {
...
}

实例化一个Query

调用 initLoader() 方法,你可以在用户输入了一些所需数据之后调用,如果你不需要用户数据,那么可以在 OnCreate() 或者 OnCreateView() 中调用


 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);
        ...
    }

开始一个查询 Query

实例化之后,会要求你实现 onCreateLoader() 的方法。这个方法返回一个 CursorLoader。

你可以实例化一个 空的 CursorLoader 然后使用它的方法来定义query,也可以在实例化的过程中定义query

@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 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;
    }
}

一旦后台拥有了这个object,则开始在后台query,搜索结束就会调用 onLoadFinished() 方法


处理 结果

如果要显示 Cursor 的数据,那么要使用

  1. 一个AdapterView的实现(Listview,Gridview,spinner)
  2. 一个CursorAdapter的实现

系统会自动的将数据从Cursor中转移到view中

public String[] mFromColumns = {
    DataProviderContract.IMAGE_PICTURENAME_COLUMN
};
public int[] mToFields = {
    R.id.PictureName
};
// 用于处理的Listview
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
    );
// 关联 adapter 和 listview
mListView.setAdapter(mAdapter);
...
/*
 * 当 query 结束的时候调用的方法
 */
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    ...
    /*
     * 将查询结果放在 adapter 中,listview会重新显示
     */
    mAdapter.changeCursor(cursor);
}

删除旧的Cursor的引用

如果 Cursor 无效了,那么 CursorLoader就会重置。这种情况一般因为与Cursor关联的数据改变了。再 重新 查询之前,会调用你实现的 onLoaderReset() 方法。在这个调用,你应该删除所有当前Cursor的引用,放置内存泄漏。

一旦该方法完成,就可以重新查询

@Override
public void onLoaderReset(Loader<Cursor> loader) {

    /*
     * Clears out the adapter's reference to the Cursor.
     * This prevents memory leaks.
     */
    mAdapter.changeCursor(null);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值