Activity 后台载入数据

    xiaoxiao2024-12-26  13

    如果直接的 在一个 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 的数据,那么要使用

    一个AdapterView的实现(Listview,Gridview,spinner)一个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); }
    转载请注明原文地址: https://ju.6miu.com/read-1295020.html
    最新回复(0)