android-listview - 在AsyncTask中造成随机崩溃,Android创建ListView内容

  显示原文与译文双语对照的内容
0 0

我在后台创建ListView的内容,当添加每个条目时,我更新 ListView adapter.Usually,但是有些时候我会得到这个错误。 而奇怪的是,我的星系in比我的HTC感觉更频繁地发生 10次。 我不明白为什么这样发生,因为我清楚地通过UI线程通知适配器。 有什么想法?

java.lang.IllegalStateException: The content of the adapter has changed but ListView 
did not receive a notification. Make sure the content of your adapter is not modified 
from a background thread, but only from the UI thread. Make sure your adapter calls 
notifyDataSetChanged() when its content changes. [in ListView(2131100779, class 
util.TouchInterceptor) with Adapter(class com.bill.deuterh.ListActivity$ListAdapter)]

AsyncTask:

private class AsyncCaller extends AsyncTask<Void,Void,Void>{
 @Override
 protected void onPostExecute(Void result) {
//TODO Auto-generated method stub
 super.onPostExecute(result);
 ListActivity.this.runOnUiThread(new Runnable(){
 @Override
 public void run() {
 findViewById(R.id.progress_bar).setVisibility(View.GONE);
 }
 });
 }
 @Override
 protected Void doInBackground(Void... params) {
//TODO Auto-generated method stub
 for (int i=0;i<table.length;i++){
 if(isCancelled()){break;}
 myList.add(createObject(table[i])));
 ListActivity.this.runOnUiThread(new Runnable(){
 @Override
 public void run() {
 ListAdapter.notifyDataSetChanged();
 }
 });
 }
 return null;
 }
}

( 如果有问题,我将Listview转换为 TouchInterceptor,这是一个修改的google类,用于支持拖放的Listview项。)

时间:原作者:5个回答

0 0

尝试:如果其他所有内容都设置正确。 然后,这个代码将显示 doInBackground 中的每一个更新,即在 listview = !

private class AsyncCaller extends AsyncTask<Void,Void,Void>{
@Override
protected void onPostExecute(Void result) {
//TODO Auto-generated method stub
 super.onPostExecute(result);
 findViewById(R.id.progress_bar).setVisibility(View.GONE);
}
@Override
protected Void doInBackground(Void... params) {
//TODO Auto-generated method stub
 for (int i=0;i<table.length;i++){
 if(isCancelled()){break;}
 myList.add(createObject(table[i])));
 publishProgress();
 }
 return null;
}
protected void onProgressUpdate(Void.. values) {
ListAdapter.notifyDataSetChanged();
}

}

OnPreExecute, onPostExecute and onProgressUpdate 已经在UIThread上运行。 也许你不按正确的方式执行任务。 这就是为什么没有更新数据的原因?

原作者:
0 0

在onpostexecute的末尾只运行一次,不需要 runonuithread 。 ListAdapter.notifyDataSetChanged() ;

删除这里选项:

 ListActivity.this.runOnUiThread(new Runnable(){
 @Override
 public void run() {
 ListAdapter.notifyDataSetChanged();
 }
 });

然后把这个

 @Override
 protected void onPostExecute(Void result) {
//TODO Auto-generated method stub
 super.onPostExecute(result);
 findViewById(R.id.progress_bar).setVisibility(View.GONE);
ListAdapter.notifyDataSetChanged();
 }
原作者:
0 0

不要在 doInBackground(Void... params) 中编写任何关联或者更新UI的代码。 用于更新异步方法的用户界面 onPostExecute(Void result)的更新。 因此从 doInbackGround(Void... params){} 中删除adatper的通知

原作者:
...