Activity 后台载入数据

来源:互联网 发布:机打增值税发票的软件 编辑:程序博客网 时间:2024/06/03 03:36

如果直接的 在一个 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

@Overridepublic 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};// 用于处理的ListviewListView 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 和 listviewmListView.setAdapter(mAdapter);.../* * 当 query 结束的时候调用的方法 */@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {    ...    /*     * 将查询结果放在 adapter 中,listview会重新显示     */    mAdapter.changeCursor(cursor);}

删除旧的Cursor的引用

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

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

@Overridepublic void onLoaderReset(Loader<Cursor> loader) {    /*     * Clears out the adapter's reference to the Cursor.     * This prevents memory leaks.     */    mAdapter.changeCursor(null);}
0 0
原创粉丝点击