我的程序为我的 GridView 使用 CursorAdapter ,并使用 AsynTask 获取 curosr 并刷新我的视图。
在任务的 doinbackgroud 中,我在 sqlite 中执行查询,并获取光标。在任务的 onPostExecute 中,我使用 CursorAdapter.changeCursor 通过新数据刷新我的视图。
但是由于游标有太多关于数千行的数据,所以在 changeCursor 时 ui 线程被阻塞。
光标不使用 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.nodes 的类是 Cursor。
当 info.members 有大约 2000 行时,它会在我的设备中阻止我的 ui 线程大约四秒钟。我在工作线程中调用 cursor.getCount() ,但它没有帮助。