簡體   English   中英

ConcurrentModificationException Room Android

[英]ConcurrentModificationException Room Android

我在我的應用程序中使用 Room,在將數據插入我的數據庫時,有時會拋出ConcurrentModificationException 為什么會這樣?

我使用分頁 api,在每次 api 調用后,我將 dataList 插入到我的數據庫中

new Thread(new Runnable() {
            @Override
            public void run() {                    
                    appDatabase.dataDao().insertMultipleData(dataList);                    
            }
        }).start();

在哪里

appDatabase = Room.databaseBuilder(context, AppDatabase.class, AppDatabase.DATABASE_NAME)
                .fallbackToDestructiveMigration()
                .build();

插入操作

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertMultipleData(List<Data> dataList);

如果您嘗試在分頁列表中插入數據,這是一個典型的場景。 由於您尚未粘貼錯誤日志,因此我假設該錯誤是由 dataList 對象引起的。 在這種情況下,錯誤消息將如下所示。

 java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.next(ArrayList.java:860)
        at androidx.room.EntityInsertionAdapter.insertAndReturnIdsArray(EntityInsertionAdapter.java:131)
        at com.myApp.data.database.entities.FeedDataDao_Impl.insertAll(FeedDataDao_Impl.java:220)

如果是這種情況,則錯誤是由不同線程並行修改同一變量引起的。 在這種情況下,我假設您將數據插入數據庫,同時進行新的服務調用(分頁)以獲取更新相同數據對象的數據。 或者,即使您在插入原始數組源時從原始數組源中刪除內容,也可能會拋出此錯誤。 解決方案非常簡單。 您可以將變量dataList復制到新變量,並將新的局部變量用作插入調用的參數。

例如:(科特林)

val localCopy = dataList
CoroutineScope(Dispatchers.IO).launch {

        AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size

 }.invokeOnCompletion {
        Log.d("Inserted all items")
 }

例如:(Java)

List<MyDataType> localCopy = dataList       
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM