adapter的数据应该在主线程中进行更改
来源:互联网 发布:泸州广电网络客服电话 编辑:程序博客网 时间:2024/05/14 18:15
02-21 14:54:28.928: E/AndroidRuntime(2846): FATAL EXCEPTION: main
02-21 14:54:28.928: E/AndroidRuntime(2846): 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. [in ListView(2131165196, class android.widget.ListView) with Adapter(class com.jovision.multiscreen.views.DeviceScanSelectDialog$DeviceAdapter)]02-21 14:54:28.928: E/AndroidRuntime(2846): at android.widget.ListView.layoutChildren(ListView.java:1510)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:2077)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.view.ViewRoot.ensureTouchModeLocally(ViewRoot.java:2095)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.view.ViewRoot.performTraversals(ViewRoot.java:809)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.view.ViewRoot.handleMessage(ViewRoot.java:1861)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.os.Looper.loop(Looper.java:130)
02-21 14:54:28.928: E/AndroidRuntime(2846): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-21 14:54:28.928: E/AndroidRuntime(2846): at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:54:28.928: E/AndroidRuntime(2846): at java.lang.reflect.Method.invoke(Method.java:507)
02-21 14:54:28.928: E/AndroidRuntime(2846): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
02-21 14:54:28.928: E/AndroidRuntime(2846): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
02-21 14:54:28.928: E/AndroidRuntime(2846): at dalvik.system.NativeStart.main(Native Method)
其中错误描述:
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.
的意思大体是,你的adapter的内容变化了,但是你的ListView并不知情。请保证你adapter的数据在主线程中进行更改!
知道了原因,改起来就好办多了,我将我的adapter类改为:
- private class DeviceAdapter extends BaseAdapter {
- private LayoutInflater inflater;
- private ArrayList<Device> devices;
- public DeviceAdapter() {
- inflater = LayoutInflater.from(mContext);
- }
- @SuppressWarnings("unchecked")
- public void setDeviceList(ArrayList<Device> list) {
- if (list != null) {
- devices = (ArrayList<Device>) list.clone();
- notifyDataSetChanged();
- }
- }
- public void clearDeviceList() {
- if (devices != null) {
- devices.clear();
- }
- notifyDataSetChanged();
- }
- @Override
- public int getCount() {
- return devices == null ? 0 : devices.size();
- }
- 以下略)
相对于原来,我做了两项改动:
1.将所有数据“完全”保存在adapter内部,即使有外部数据进入,也会用.clone()重新生成副本,保证了数据完全是由adapter维护的。
2.保证所有setDeviceList()/clearDeviceList()是从主线程里调用的,如何保证是从主线程中调用的呢:
a.调用Activity.runOnUIThread()方法;
b.使用Handler(其实这并不非常准确,因为Handler也可以运行在非UI线程);
c.使用AsyncTask。
希望能帮到遇到同样问题的同学~
0 0
- adapter的数据应该在主线程中进行更改
- 在adapter 中进行数据的操作
- 不要在UI主线程中进行耗时的操作
- ListView adapter中的Data也要在主线程更改否则报错如下:
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- Android4.0不能在主线程中进行HTTP请求
- Android4.0不能在主线程中进行HTTP请求
- Android4.0不能在主线程中进行HTTP请求
- Android4.0不能在主线程中进行HTTP请求
- Android4.0不能在主线程中进行HTTP请求
- Android开发中在线程(非主线程)中更改视图
- 关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)
- 在当前线程中访问主线程的控件
- 在主线程中使用CRITICAL_SECTION 引起的阻塞
- WebBrowser在非主线程的线程中创建
- 在异步线程中使用主线程的handler
- 关于在UI中刷新主线程的问题
- 创建数据库
- php 索引,关联数组之mysql_fetch_assoc ,mysql_fetch_array,mysql_fetch_row 三者的区别?
- Computer English-(1)introduction
- ATM部分java代码
- POJ 3566 (弱校联萌十一大决战之厉兵秣马 B. Building for UN)
- adapter的数据应该在主线程中进行更改
- Cocos2D的随机数生成函数
- JAVA多线程和并发基础面试问答
- 编写JS脚本给mongodb添加一列为已有列的相关值
- 六种人吃五谷杂粮要留意(舞谷丰登养生坊)
- u3d零基础学习之2d游戏学习笔记
- Cisco IOS 配置PPPOE
- 用java代码写窗口背景
- C++ 构造函数与析构函数(五)