以下代码有时会出现此问题:
public void add(final EventLog eventLog, final GSTask task) {
Report.getQueryBuilder(true).matching(task).build().getFirstInBackground(new GetCallback<Report>() {
@Override
public void done(Report report, ParseException e) {
if (report == null) {
// create new report
report = Report.create(new LogStrategyFactory(), new TaskLogStrategyFactory(), task);
}
JSONObject reportEntry = new JSONObject();
// constructing the JSONObject - omitted for clarity
report.addEntry(reportEntry);
report.pinThenSaveEventually();
}
});
;
}
因此,简而言之,代码只是查看是否存在任何先前的报告,如果不创建新的报告。然后在报告中添加一个新条目,最后固定并保存。
addEntry的代码:
@Override
public void addEntry(JSONObject jsonObject) {
increment(eventCount);
add(reportEntries, jsonObject);
}
并且pinThenSaveEventually:
public <T extends ParseObject> void pinThenSaveEventually() {
this.pinInBackground(getPin(), new SaveCallback() {
@Override
public void done(ParseException e) {
ExtendedParseObject.this.saveEventually();
}
});
}
我的所有子类都扩展ExtendedParseObject
,再次扩展ParseObject
。这样就可以使用泛型添加额外的功能,如上所示。
注意:我自己从不迭代报告条目,否则可能会导致问题。
我怀疑可能是连续两次调用add(在pin / save完成之前)可能是原因,但未确认。
想听听是否有人有任何建议。
堆栈跟踪:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
at java.util.HashMap$ValueIterator.next(HashMap.java:838)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:79)
at com.parse.ParseTraverser.traverse(ParseTraverser.java:129)
at com.parse.ParseObject.collectDirtyChildren(ParseObject.java:2227)
at com.parse.ParseObject.access$1100(ParseObject.java:52)
at com.parse.ParseObject$37.visit(ParseObject.java:2281)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:46)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:80)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:86)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:80)
at com.parse.ParseTraverser.traverse(ParseTraverser.java:129)
at com.parse.ParseObject.collectDirtyChildren(ParseObject.java:2227)
at com.parse.ParseObject.collectDirtyChildren(ParseObject.java:2298)
at com.parse.ParseObject.saveEventually(ParseObject.java:1578)
at com.guardswift.modules.parse.subclass.ExtendedParseObject$4.done(ExtendedParseObject.java:140)
at com.guardswift.modules.parse.subclass.ExtendedParseObject$4.done(ExtendedParseObject.java:137)
at com.parse.ParseTaskUtils$1.done(ParseTaskUtils.java:66)
at com.parse.ParseTaskUtils$1.done(ParseTaskUtils.java:63)
at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:107)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5633)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712)
at dalvik.system.NativeStart.main(NativeStart.java)