带有来自 Observer 的可变列表的 ConcurrentModificationException
ConcurrentModificationException with mutable list from Observer
Grettings,谁能帮我解决这个问题,我已经实现了一个辅助列表来添加来自观察者的元素,但问题仍然存在,ConcurrentModificationException
发生在 addAll 行.
在一个片段 Class 中,我有一个来自项目经理的观察者,他提供了一个将显示在数组列表中的元素列表
manager.getMutableList()
.observe(viewLifecycleOwner, Observer { mutableList ->
val auxList = mutableListOf<CustomClass>().apply {
addAll(mutableList)
}
if (auxList.isNotEmpty()) {
...
} else {
...
}
(recyclerView.adapter as RecyclerAdapter).run {
items = auxList
notifyDataSetChanged()
...
}
})
这是堆栈跟踪
java.util.ArrayList$SubList.size (ArrayList.java:1057)
java.util.ArrayList.addAll (ArrayList.java:588)
com.project.project.Fragment$setObservers.onChanged (Fragment.java:330)
com.project.project.Fragment$setObservers.onChanged (Fragment.java:74)
androidx.lifecycle.LiveData.considerNotify (LiveData.java:131)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)
如有任何帮助,我们将不胜感激!
问题是您从主线程以外的线程修改 mutableList
。避免这些异常的最好方法是使您的列表 不可变 (所以只是 List
而不是 MutableList
)。
所有想要修改它的代码都需要制作一个自己的副本:
val copy = list.toMutableList()
copy.add(...)
Grettings,谁能帮我解决这个问题,我已经实现了一个辅助列表来添加来自观察者的元素,但问题仍然存在,ConcurrentModificationException
发生在 addAll 行.
在一个片段 Class 中,我有一个来自项目经理的观察者,他提供了一个将显示在数组列表中的元素列表
manager.getMutableList()
.observe(viewLifecycleOwner, Observer { mutableList ->
val auxList = mutableListOf<CustomClass>().apply {
addAll(mutableList)
}
if (auxList.isNotEmpty()) {
...
} else {
...
}
(recyclerView.adapter as RecyclerAdapter).run {
items = auxList
notifyDataSetChanged()
...
}
})
这是堆栈跟踪
java.util.ArrayList$SubList.size (ArrayList.java:1057)
java.util.ArrayList.addAll (ArrayList.java:588)
com.project.project.Fragment$setObservers.onChanged (Fragment.java:330)
com.project.project.Fragment$setObservers.onChanged (Fragment.java:74)
androidx.lifecycle.LiveData.considerNotify (LiveData.java:131)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)
如有任何帮助,我们将不胜感激!
问题是您从主线程以外的线程修改 mutableList
。避免这些异常的最好方法是使您的列表 不可变 (所以只是 List
而不是 MutableList
)。
所有想要修改它的代码都需要制作一个自己的副本:
val copy = list.toMutableList()
copy.add(...)