我的程序在我的GridView中使用CursorAdapter,並使用AsynTask來獲取curosr並刷新我的視圖。CursorAdapter在android中改變遊標bolck ui線程
在任務的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的類是光標。
當info.members有大約2000行時,它會在我的設備中阻塞我的UI線程約四秒鐘。 我在工作線程中調用cursor.getCount(),但它沒有幫助。
您是如何得出結論的:使用'changeCursor()'阻止UI線程? – Luksprog
首先,當遊標中的數據大約有一百個時,它不會阻塞ui線程。而當數據大約有五百個時,它會阻塞幾秒。但是當數據超過一千時,就會導致ANR。第二。所有獲取數據的代碼都在doinbackground.and onPostExecute方法中,除了changeCursor()之外,其他所有代碼都可以使用。 –
@ZebulonLi如果你只是忽略返回值,爲什麼要調用'.getCount()'? – SK9