gpt4 book ai didi

android - CursorAdapter changeCursor bolck ui thread in android

转载 作者:行者123 更新时间:2023-11-30 03:24:21 25 4
gpt4 key购买 nike

我的程序为我的 GridView 使用 CursorAdapter,并使用 AsynTask 获取 curosr 并刷新我的 View 。

在任务的 doinbackgroud 中,我在 sqlite 中执行查询,并获取光标。在任务的 onPostExecute 中,我使用 CursorAdapter.changeCursor 通过新数据刷新我的 View 。

但是当改变Cursor时ui线程被阻塞了,因为游标有太多的数据,大约有几千行。

cursor不是用了lasy策略吗?我该怎么办?

我的代码:

private class ToNodeTask extends AsyncTask<Long, Void , OrgManager.CursorDataInfoInStruct >{

protected Long taskId = null;

@Override
protected OrgManager.CursorDataInfoInStruct doInBackground(Long... params) {
taskId = params[0];
OrgManager.CursorDataInfoInStruct info = OrgManager.getInstance().getCursorDataInfoInStruct(taskId);
if(info != null){
if(info.members != null){
info.members.getCount();
}
if(info.nodes != null){
info.nodes.getCount();
}
}

return info;
}

@Override
protected void onPostExecute( OrgManager.CursorDataInfoInStruct result) {
super.onPostExecute(result);

if(result != null){

gridAdapter.changeCursor(result.members);
departmentAdapter.changeCursor(result.nodes);
}

}

}

//OrgManager.java

public CursorDataInfoInStruct getCursorDataInfoInStruct(long structId){
OrgStruct struct = getStruct(structId);
if(null == struct && structId != 0) return null;

CursorDataInfoInStruct info = new CursorDataInfoInStruct();
info.parent = struct;
info.nodes = getDb().rawQuery(SQL_QUERY_NODE_DATA_IN_SRUCT, new String[]{String.valueOf(structId)});
info.members = getDb().rawQuery(SQL_QUERY_MEMBER_DATA_IN_SRUCT , new String[]{String.valueOf(structId)});

return info;
}

info.members 和 info.no​​des 的类是 Cursor。

当 info.members 有大约 2000 行时,它会在我的设备中阻塞我的 ui 线程大约四秒钟。我在工作线程中调用了 cursor.getCount(),但它没有帮助。

最佳答案

参见 Using Cursor with ListView adapter for a large amount of data

当您使用 changeCursor 时,它会调用 Cursor.getCount() -“这会强制完全执行查询并对结果进行计数”。

我这样做了——在后台线程中准备游标并获取它的长度(从数据库中提取数据将在此处执行):

stopManagingCursor(cursor);
cursor = dbAdapter.getData(query);
startManagingCursor(cursor);
count = cursor.getCount();

在 UI 线程 (onPostExecute) 中改变光标:

recordsAdapter.changeCursor(cursor);

在这种情况下,更改光标不会卡住 UI 线程。

关于android - CursorAdapter changeCursor bolck ui thread in android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18524247/

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