gpt4 book ai didi

java - Android CursorAdapters、ListViews 和后台线程

转载 作者:太空狗 更新时间:2023-10-29 14:34:53 25 4
gpt4 key购买 nike

我一直在处理的这个应用程序有包含数兆字节数据的数据库需要筛选。许多 Activity 只是 ListViews 在数据库中的不同级别的数据中下降,直到我们到达“文档”,这只是从数据库中提取并显示在手机上的 HTML。我遇到的问题是,其中一些 Activity 需要能够通过捕获击键并使用其中的“like %blah%”重新运行查询来搜索数据库。除了用户第一次加载数据和用户第一次输入击键时,这工作得相当快。我正在使用 ResourceCursorAdapter 并在后台线程中生成光标,但为了执行 listAdapter.changeCursor(),我必须使用 Handler 将其发布到主 UI 线程。然后这个特定的调用卡住了 UI 线程足够长的时间以调出可怕的 ANR 对话框。我很好奇如何将其完全卸载到后台线程,以便用户界面保持响应并且我们不会弹出 ANR 对话框。

为了全面披露,我最初返回自定义模型对象的 ArrayList 并使用 ArrayAdapter,但(可以理解)客户指出这是糟糕的内存管理,而且我对性能并不满意。我真的很想避免生成大量对象列表然后执行 listAdapter.notifyDataSetChanged/Invalidated()

这里是有问题的代码:

private Runnable filterDrugListRunnable = new Runnable() {
public void run() {
if (filterLock.tryLock() == false) return;

cur = ActivityUtils.getIndexItemCursor(DrugListActivity.this);

if (cur == null || forceRefresh == true) {
cur = docDb.getItemCursor(selectedIndex.getIndexId(), filter);
ActivityUtils.setIndexItemCursor(DrugListActivity.this, cur);
forceRefresh = false;
}

updateHandler.post(new Runnable() {
public void run() {
listAdapter.changeCursor(cur);
}
});

filterLock.unlock();

updateHandler.post(hideProgressRunnable);
updateHandler.post(updateListRunnable);
}
};

最佳答案

我很难相信 listAdapter.changeCursor() 会占用足够的时间导致 ANR,假设您在后台线程中创建了 Cursor。只是不应该有那么多的工作需要发生来重新绘制少数列表行。我会仔细检查你在 Handler 中所做的工作是否像你想象的那样有限。或许可以考虑使用 AsyncTask,这样可以更轻松地将后台工作 (doInBackground()) 与 on-UI 线程后处理 (onPostExecute()) 分开。

您可以尝试直接替换适配器,方法是再次调用 setAdapter() 并使用新的 Cursor 包裹在新的适配器中。

您可以查看 AutoCompleteTextView 如何处理这种情况,因为它使用 SpinnerAdapter 进行即时过滤。也许它的某些技术可以适用于您的情况。

关于java - Android CursorAdapters、ListViews 和后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338087/

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