赞
踩
如果直接的 在一个 ContentProvider
中搜索想要显示的数据,那么需要花费很多时间,很有可能造成卡顿,ANR
你也可以异步的在后台 用一个对象 来载入 然后当完成的时候 在重新和你的 Activity 建立联系
我们使用的对象就是 CursorLoader ,CursorLoader
可以在数据变更的时候,自动的重新运行
CursorLoader 在 v4 的支持库中
CursorLoader
的 Activity如果要使用 CursorLoader,必须实现LoaderCallbacks<Cursor>
的接口,如下:
public class PhotoThumbnailFragment extends FragmentActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
...
}
调用 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);
...
}

实例化之后,会要求你实现 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 的数据,那么要使用
系统会自动的将数据从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 无效了,那么 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);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。