我正在调用ASyncTask
更新我的适配器,并且在填充我的列表时偶尔会遇到此运行时错误
E/AndroidRuntime(16197): java.lang.IllegalStateException: 适配器的内容已经改变,但ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。
从后台线程填充我的适配器是一个坏主意,就像错误消息所暗示的那样?
我正在打电话notifyDataSetChanged()
,onPostExecute()
但是当我打电话时我也遇到了同样的错误onProgressUpdate()
。
这是我的异步任务。假设 fetchOneItem() 从项目列表中获取单个项目,填写名称/描述,然后在下一次迭代中移动到下一个项目。
private class GetItems extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setTitle("Displaying...");
pd.setMessage("Please wait.");
pd.setCancelable(false);
pd.setIndeterminate(true);
pd.show();
TextView myMsg = (TextView)findViewById(R.id.topMsg);
myMsg.setText("Displaying items...");
}
protected Integer doInBackground(Integer... params) {
// TODO Auto-generated method stub
do {
fetchOneItem(); // fetches 1 item
myList.add(new Item(name, description));
Log.i(TAG, "Adding " + name + ", " + desc + ", adapter size = " + myAdapter.getCount());
publishProgress(i);
} while (doneFetching != true);
Log.i(TAG, "Completed loading, i =" + i);
return i;
}
protected void onProgressUpdate(Integer... values) {
TextView myMsg = (TextView)findViewById(R.id.topMsg);
myMsg.setText("Displaying " + Integer.toString(values[0].intValue()) + " items");
}
@Override
protected void onPostExecute(Integer numItems) {
TextView myMsg = (TextView)findViewById(R.id.topMsg);
myMsg.setText("Displayed " + numItems + " items");
myAdapter.notifyDataSetChanged();
allItemsLoaded = true;
Log.i(TAG, "Adapter size = " + myAdapter.getCount());
pd.dismiss();
}
}