我遇到IllegalStateException将基础List更新为适配器(可能是ArrayAdapter或BaseAdapter的扩展,我不记得了).我目前没有或记住异常的文本,但它说明了List的内容更改的效果,而没有适配器已被通知更改.
此List /可以/从UI线程(main)以外的其他线程更新.更新此列表(添加项目)后,我调用notifyDataSetChanged.问题似乎是适配器或附加到适配器的ListView在调用此方法之前尝试更新自身.发生这种情况时,抛出IllegalStateException.
如果我在更新之前将ListView的可见性设置为GONE,那么再次可见,则不会发生错误.但这并不总是实用的.
我在某处读到你无法从另一个线程修改底层 - 这似乎限制了一个MVC模式,就像这个特定的List一样,我想从不同的线程中添加项目.我假设只要我调用notifyDataSetChanged()我就是安全的 - 在调用此方法之前,适配器没有重新访问底层List,但似乎并非如此.
我想我要问的是,从UI以外的线程更新底层列表是否安全?此外,如果我想修改适配器中的数据,我是否修改基础列表或适配器本身(通过其add()等方法).通过适配器修改数据似乎是错误的.
我在另一个网站上遇到了一个似乎与我有类似问题的人:http : //osdir.com/ml/Android-Developers/2010-04/msg01199.html(这是我抓住了Visibility.GONE和.VISIBLE idea).
为了让您更好地了解我的特定问题,我将介绍我的List,Adapter等的设置方法.
我有一个名为Queue的对象,它包含一个LinkedList.队列扩展了Observable,当通过其方法将事物添加到其内部列表时,我调用setChanged()和notifyListeners().此Queue对象可以在任意数量的线程中添加或删除项目.
我有一个包含适配器的"队列视图"活动.此活动在其onCreate()方法中将Observer侦听器注册到我的Queue对象.在Observer的update()方法中,我在Adapter上调用notifyDataSetChanged().
我添加了大量的日志输出,并确定当发生IllegalStateExcption时,我的Observer回调从未被调用过.因此,在Observer有机会通知其观察者之前,适配器注意到List的更改,并调用我的方法通知适配器内容已更改.
所以我想我要问的是,这是一个装配适配器的好方法吗?这是一个问题,因为我正在从UI线程以外的线程更新适配器的内容吗?如果是这种情况,我可能会想到一个解决方案(在创建UI线程时将Queler对象赋予UI线程,并使用该Handler进行所有List修改,但这似乎不合适).
我意识到这是一个非常开放的帖子,但我对此有点失落,并会对我写的内容有所评论.
android ×1