我刚刚开始使用新的cursorLoader,我遇到了问题.以下代码只是为了理解cursorLoader的工作原理,但我一直在得到:
当我恢复此活动时,"尝试重新查询并已关闭游标".在我开始使用cursorLoader之前,应用程序运行正常.有任何想法吗?
private Cursor getSectionData(CharSequence parent_id) {
String[] projection = new String[] {Titles.SECTION, Titles.TITLE, Titles._ID, Titles.CODE_RANGE,};
Uri titles = Titles.CONTENT_URI;
String select = "" + Titles.PARENT_ID + " match " + parent_id + "";
CursorLoader loader = new CursorLoader(this, titles, projection, select, null, null);
Cursor cTitles = loader.loadInBackground();
String[] projection1 = new String[] {Codes.CODE, Codes.EXCERPT, Codes._ID,};
Uri codes = Codes.CONTENT_URI;
String select1 = "" + Codes.PARENT_ID + " match " + parent_id + "";
CursorLoader loader1 = new CursorLoader(this, codes, projection1, select1, null, null);
Cursor cCodes = loader1.loadInBackground();
//Cursor cTitles = db.rawQuery("select section, title, _id, code_range from titles where parent_id match " + parent_id + "", null);
//startManagingCursor(cTitles);
//Cursor cCodes = db.rawQuery("select code, excerpt, _id from codes where parent_id match " + parent_id + "", null);
mQuery = "select code, excerpt, _id from codes where parent_id match " + parent_id + "";
//startManagingCursor(cCodes);
Cursor[] c = {cTitles, cCodes};
Cursor cursor = new MergeCursor(c);
startManagingCursor(cursor);
return cursor;
}
Run Code Online (Sandbox Code Playgroud)
Fra*_*aro 12
我不相信从loader.loadInBackground()捕获Cursor就是你想要的.loadInBackground()的实现基本上执行查询并返回UI线程上的光标,这是您试图避免的.
您在UI线程上等待返回值时要小心.这应该是一个很好的指标,这不是你想要的.
我解决这个问题的方法是重启加载器.就我而言,我正在尝试使用操作栏来搜索我的内容.我的类扩展了ListFragment并实现了LoaderManager.LoaderCallbacks包含它的Activity实现了OnQueryTextListener并且在这里调用片段是我在片段中所做的代码.
public void doSearch(String query) {
Bundle bundle = new Bundle();
bundle.putString("query", query);
getLoaderManager().restartLoader(LoaderMangerIdHelper.INVENTORY, bundle, this);
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须重新启动加载程序.加载器都由系统管理.这将导致重新调用onCreateLoader.因此,您必须在那里检查查询字符串以设置您的选择.
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
String SELECTION = "someColumn=?";
List<String> selectionArgs = new ArrayList<String>();
selectionArgs.add("someArgs");
if (bundle != null && bundle.containsKey("query")) {
SELECTION += " AND columnTitle LIKE ?";
selectionArgs.add(bundle.getString("query") + "%");
}
final String[] SELECTION_ARGS = new String[selectionArgs.size()];
selectionArgs.toArray(SELECTION_ARGS);
mLoader = new CursorLoader(getActivity(), RoamPay.Product.CONTENT_URI, null, SELECTION,
SELECTION_ARGS, null);
return mLoader;
}
Run Code Online (Sandbox Code Playgroud)
这将在后台启动cursorLoading.回调应该和往常一样.
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
Run Code Online (Sandbox Code Playgroud)