[Android:ConcurrentModificationException错误

问题描述 投票:0回答:1

我在这里挠头试图理解为什么我在这里得到ConcurrentModificationException ...

这是我的代码:

var adapterCurrentList : PagedList<WorkPackagesQuery.WorkPackage>? = null
val workPackagesArrayList = arrayListOf<WorkPackagesQuery.WorkPackage>()

fun turnPagedListIntoArrayList(searchString: String) {
    workPackagesArrayList.clear()
    val tempCurrentArray = Collections.synchronizedList(adapterCurrentList)
    synchronized(tempCurrentArray) {

        for ((index, workPackage) in tempCurrentArray.withIndex()) { //exception is thrown here. 
            if (workPackage.id().contains(searchString)) {
                workPackagesArrayList.add(workPackage)
            }
        }
    }

}

我想念的是什么?我没有在迭代时修改tempCurrentArray ...第一次,使用searchString,它运行良好,第二次,使用不同的searchString,它引发异常。

这里是堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bechtel.pf.mock, PID: 18686
java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.size(ArrayList.java:1057)
    at androidx.paging.PagedStorage.get(PagedStorage.java:170)
    at androidx.paging.PagedList.get(PagedList.java:410)
    at java.util.AbstractList$Itr.next(AbstractList.java:358)
    at com.bechtel.pf.ui.workpackages.WorkPackagesViewModel.turnPagedListIntoArrayList(WorkPackagesViewModel.kt:48)
    at com.bechtel.pf.ui.workpackages.WorkPackagesViewModel.pareDownArrayForSearch(WorkPackagesViewModel.kt:59)
    at com.bechtel.pf.ui.workpackages.WorkPackagesFragment$onCreateView$$inlined$addTextChangedListener$1.afterTextChanged(TextView.kt:101)
android kotlin concurrentmodification
1个回答
0
投票

您的问题是workPackagesArrayList.clear(),其实现(ArrayList.java)如下:

public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

如您所见,它不是线程安全的。

您应该同步workPackagesArrayList.clear()上的呼叫。并且最好在完成tempCurrentArray同步的同一个对象上进行同步。

© www.soinside.com 2019 - 2024. All rights reserved.