问题描述
什么是应遵循的后台线程(异步任务)?更新listactivty内容的最佳实践
1)我打电话在 notifyDataSetChanged(),以尽快更新适配器我操纵适配器的内容,但同时用户滚动或单击列表中的还是我的应用程序强制关闭。以prevent任何指针,这将是非常有益的。
logcat的:
java.lang.IllegalStateException:适配器的内容发生了变化,但ListView控件没有收到通知
2)exaclty我应该更新listactivity的内容是什么?在doInBackground()或onProgressUpdate()里面呢?
3),当用户点击列表项是经历常规崩溃。因此,将在后台运行期间禁止在listactivty click事件解决这个问题?如果是这样我不知道如何删除或动态设置项点击听众的listactivity。请指示我的了。
4)我不认为后台异步任务执行期间阻止所有UI交互是解决问题的唯一途径。我知道有这样一个简单的方法,但需要一些帮助。
先谢谢了。
这是我的onCreate ...
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.fa);tvStatus =(的TextView)findViewById(R.id.tvStatus); 适配器=新SimpleAdapter(
本,
mostPopularList,
R.layout.list_item,
新的String [] {标题,作者,意见,日期},
新的INT [] {R.id.textView1,R.id.textView2,R.id.textView4,R.id.textView3});
// populateList();
setListAdapter(适配器);
}
我的异步任务...
私有类LongOperation扩展的AsyncTask<弦乐,太虚,字符串> { @覆盖
保护字符串doInBackground(字符串... PARAMS){
// code增加新listactivty项目
} @覆盖
保护无效onPostExecute(字符串networkStatus){
adapter.notifyDataSetChanged();
} @覆盖
在preExecute保护无效(){ } @覆盖
保护无效onProgressUpdate(虚空......值){ }
}
logcat的:
我很少在非法状态的异常太...无法重现它。将张贴的logcat如果我再次遇到它。
致命异常:主要
java.lang.IndexOutOfBoundsException:无效指数7,大小为4
在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
在java.util.ArrayList.get(ArrayList.java:311)
在android.widget.SimpleAdapter.bindView(SimpleAdapter.java:147)
在android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
在android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
在android.widget.AbsListView.obtainView(AbsListView.java:1294)
在android.widget.ListView.makeAndAddView(ListView.java:1727)
在android.widget.ListView.fillDown(ListView.java:652)
在android.widget.ListView.fillGap(ListView.java:623)
在android.widget.AbsListView.trackMotionScroll(AbsListView.java:2944)
在android.widget.AbsListView.onTouchEvent(AbsListView.java:2065)
在android.widget.ListView.onTouchEvent(ListView.java:3315)
在android.view.View.dispatchTouchEvent(View.java:3766)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
在android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:4627)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
Inside onProgressUpdate()
or inside onPostExecute() because it could take some time since you change content in doInBackground()
and call async task calls your
@Override
protected void onPostExecute(String networkStatus) {
adapter.notifyDataSetChanged();
}
It is not a solution. You just need update your dataset on UI thread. (Not load content, just update from old to a new one). For example
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected List<String> doInBackground(String... params) {
List<String> items = loadUpdatedDataset(params);
return items;
}
@Override
protected void onPostExecute(List<String> loadedItems) {
updateAdapterDataset(loadedItems);
adapter.notifyDataSetChanged();
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
这篇关于java.lang.IllegalStateException:适配器的内容发生了变化,但ListView控件....召notifydatasetchanged inspite()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!