Моя программа использует CursorAdapter для моего GridView и использует AsynTask для получения curosr и обновления моего представления.
В задаче doinbackgroud я выполняю запрос в sqlite и получаю курсор. В задаче onPostExecute я использую CursorAdapter.changeCursor для обновления представления новыми данными.
Но поток пользовательского интерфейса был заблокирован при изменении курсора, потому что курсор имеет слишком много данных о тысячах строк.
Разве курсор не использует ленивую стратегию? Как мне поступить?
мой код:
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 строк, он заблокирует мой поток пользовательского интерфейса примерно на четыре секунды на моем устройстве. Я вызываю cursor.getCount() в рабочем потоке, но это не помогает.
changeCursor()
блокирует поток пользовательского интерфейса? - person user   schedule 30.08.2013.getCount()
, если вы собираетесь игнорировать только возвращаемое значение? - person SK9   schedule 24.01.2014