Android 将数据插入房间数据库时的ConcurrentModificationException

Android 将数据插入房间数据库时的ConcurrentModificationException,android,Android,我基本上是想在我的房间数据库中保存一个截击响应,这样我以后可以检索它供脱机使用,但每次我启动我的应用程序时,我都会遇到这个异常,我尝试了很多方法来解决它,但对我来说没有任何效果,任何帮助都将不胜感激。多谢各位 String api_keys = "MyApiKey" + awayid; JsonObjectRequest jsonObjectRequest2 = new JsonObjectRequest(Request.Method.GET, api_keys, null, new Resp

我基本上是想在我的房间数据库中保存一个截击响应,这样我以后可以检索它供脱机使用,但每次我启动我的应用程序时,我都会遇到这个异常,我尝试了很多方法来解决它,但对我来说没有任何效果,任何帮助都将不胜感激。多谢各位

String api_keys = "MyApiKey" + awayid;

JsonObjectRequest jsonObjectRequest2 = new JsonObjectRequest(Request.Method.GET, api_keys, null, new Response.Listener<JSONObject>() {
               @Override
               public void onResponse(JSONObject response) {
                   try {
                       JSONArray jsonArray2 = response.getJSONArray("teams");

                       for (int i = 0; i < jsonArray2.length(); i++) {

                           JSONObject jsonObject2 = jsonArray2.getJSONObject(i);

                           String awaylogo = jsonObject2.getString("strTeamBadge");

                           modelList.add(new Model(eventid,myround, date, hometeam, awayteam, homelogo, awaylogo, homescore, 
      awayscore, stadium, "Details", mytime));

                           new Thread(new Runnable() {
                               @Override
                               public void run() {

                                   ApplicationDatabase database = DatabaseClient.getInstance(getApplicationContext()).getApplicationDatabase();

                               database.modelDao().insert(modelList); /// here it is the problem in this line

                              }
                          }).start();
                      } 
                  } catch (JSONException e) {
                      e.printStackTrace();
                  }
              }
          }, error -> {});
String api_keys=“MyApiKey”+awayid;
JsonObjectRequest jsonObjectRequest2=新的JsonObjectRequest(Request.Method.GET,api_键,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
JSONArray jsonArray2=response.getJSONArray(“团队”);
for(int i=0;i{});
***这是我的刀

@Dao
public interface  modelDAO {

    @Query("SELECT * FROM Model ")
    List<Model> listAll();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(List<Model> model);

}

@Dao
公共接口模型{
@查询(“从模型中选择*)
List listAll();
@插入(onConflict=OnConflictStrategy.REPLACE)
无效插入(列表模型);
}

因为在for循环中启动了大量线程。
在for循环之后移动新线程。

解决方案实际上是将一个模型对象传递到my room db而不是模型列表,因此希望此答案对其他人有所帮助。

在将数据插入数据库时,您是否在任何位置修改数据对象?如果是这种情况,错误可能是由不同线程并行修改同一变量引起的。或者,即使您在插入原始数组源时从原始数组源中删除了内容,也会引发此错误。文件室插入操作是一种异步操作。如果使用协同程序运行插入,则可以在invokeOnCompletion块中获得完成。否则,如果您真的需要在不等待完成的情况下修改对象,则解决方案非常简单。您可以将变量modelList复制到新变量,并将新的局部变量用作insert调用的参数

例如:(科特林)

例如:(爪哇)

List localCopy=modelList
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size

我将代码移到catch exception的正上方,但仍然收到相同的错误,我试图将其移出截击请求,没有保存任何数据,我不知道我做错了什么
val localCopy = modelList
CoroutineScope(Dispatchers.IO).launch {

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

 }.invokeOnCompletion {
        Log.d("Inserted all items")
 }
List<MyDataType> localCopy = modelList       
AppDatabase.getDatabase(context).feedDataDao().insertAll(localCopy).size