在onPostExecute方法中写入Realm的并发修改异常 - Android

时间:2016-11-21 11:15:03

标签: java android android-asynctask realm concurrentmodification

我使用Realm作为我的数据库。在插入/更新数据时,我收到以下错误

FATAL EXCEPTION: main
Process: uk.org.humanfocus.hfi, PID: 6430
 java.util.ConcurrentModificationException
 at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
  at org.json.JSONArray.writeTo(JSONArray.java:612)
  at org.json.JSONStringer.value(JSONStringer.java:233)
  at org.json.JSONObject.writeTo(JSONObject.java:720)
  at org.json.JSONObject.toString(JSONObject.java:689)
  at uk.org.humanfocus.hfi.DriverBehavior.DriverBehaviorMap$InsertCarProbeData.onPostExecute(DriverBehaviorMap.java:252)
  at uk.org.humanfocus.hfi.DriverBehavior.DriverBehaviorMap$InsertCarProbeData.onPostExecute(DriverBehaviorMap.java:229)
  at android.os.AsyncTask.finish(AsyncTask.java:651)
  at android.os.AsyncTask.-wrap1(AsyncTask.java)
  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5443)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

与其他人不同,我没有在for循环中执行此操作,而是在AsyncTask的onPostExecute方法中执行此操作,该方法是从位置更改的侦听器调用的。也没有在其他地方使用。

private class InsertCarProbeData extends AsyncTask<Void, Void, Void> {

    Location location;

    public InsertCarProbeData(Location location) {
        this.location = location;
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            addObjectToJSONArray(location);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        realm.beginTransaction();
        trip.json = tripJSON.toString();
        realm.commitTransaction();
    }
}

这个AsyncTask是从这里调用的

new InsertCarProbeData(location).execute();

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题:

1)您将所有值存储在JSONArray中,这意味着它也会尝试重写所有PREVIOUS值。当数组变大时,新数据仍然存在,而旧值仍然处理 - 这是错误的原因

2).onPostExecute()方法在主线程上执行,因此通过这样做,你没有AsyncTask的好处。

3)AsyncTask已过时并且共享相同的线程池(具有相同的概率,作为主线程)

有类似的答案,请查看:Writing realm from service class causing UI block