获取ConcurrentModificationException添加到数组

时间:2015-06-24 14:30:09

标签: android parse-platform

以下代码有时会出现此问题:

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)

0 个答案:

没有答案