在 onPostExecute 方法中写入 Realm 的并发修改异常 - Android
Concurrent Modification Exception Writing to Realm in onPostExecute method - Android
我正在使用 Realm 作为我的数据库。虽然 inserting/updating 数据出现以下错误
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) 您将所有值存储在 JSONArray 中,这意味着它也会尝试对所有先前的值进行 wtite。当数组变大时,新数据到达,而旧值仍在处理中 - 这就是错误的原因
2) .onPostExecute() 方法是在主线程上执行的,所以这样做,你就没有 AsyncTask 的好处。
3) AsyncTask 已过时并且共享同一个线程池(与主线程具有相同的优先级)
有类似的回答,查一下:
我正在使用 Realm 作为我的数据库。虽然 inserting/updating 数据出现以下错误
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) 您将所有值存储在 JSONArray 中,这意味着它也会尝试对所有先前的值进行 wtite。当数组变大时,新数据到达,而旧值仍在处理中 - 这就是错误的原因
2) .onPostExecute() 方法是在主线程上执行的,所以这样做,你就没有 AsyncTask 的好处。
3) AsyncTask 已过时并且共享同一个线程池(与主线程具有相同的优先级)
有类似的回答,查一下: