gpt4 book ai didi

Android CursorLoader,试图重新查询一个已经关闭的游标

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:29:40 26 4
gpt4 key购买 nike

我刚开始使用新的 cursorLoader,但遇到了问题。以下代码只是为了了解 cursorLoader 的工作原理,但我不断得到:

当我恢复此 Activity 时,“正在尝试重新查询已关闭的游标”。在我开始使用 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;

}

最佳答案

我不相信从 loader.loadInBackground() 捕获 Cursor 是您想要的。loadInBackground() 的实现基本上执行查询并返回 UI 线程上的光标,这是您试图避免的。

在等待 UI 线程返回值的任何时候都要小心。这应该是一个很好的指标,表明这不是您想要的。

我为解决此问题所做的是重新启动加载程序。就我而言,我正在尝试使用操作栏来搜索我的内容。我的类扩展了 ListFragment 并实现了 LoaderManager.LoaderCallbacks包含此实现的 Activity 实现了 OnQueryTextListener 并在此处调用 fragment 是我在 fragment 中执行的代码。

public void doSearch(String query) {
Bundle bundle = new Bundle();
bundle.putString("query", query);

getLoaderManager().restartLoader(LoaderMangerIdHelper.INVENTORY, bundle, this);
}

请注意,您必须重新启动加载程序。装载机都由系统管理。这将导致您的 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;
}

这会在后台启动 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);
}

关于Android CursorLoader,试图重新查询一个已经关闭的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6053369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com