1

The problem sometimes occur with the following code:

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();

        }
    });


    ;
}

So, in short, the code simply looks if any previous report exists, if not create a new one. Then add a new entry to the report, finally pin and save.

The code for addEntry:

@Override
public void addEntry(JSONObject jsonObject) {
    increment(eventCount);
    add(reportEntries, jsonObject);
}

And pinThenSaveEventually:

public <T extends ParseObject> void pinThenSaveEventually() {
    this.pinInBackground(getPin(), new SaveCallback() {
        @Override
        public void done(ParseException e) {
            ExtendedParseObject.this.saveEventually();
        }
    });
}

All my subclasses extend ExtendedParseObject which again extends ParseObject. This way adding extra functionality using generics as shown above.

Note: I never iterate the report entries myself, which otherwise could cause problems.

I suspect that maybe calling add twice in a row (before pin/save completes ) might be the cause, though not confirmed.

Would like to hear if anyone has any suggestions.

The stack trace:

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)
cYrixmorten
  • 7,110
  • 3
  • 25
  • 33
  • Same problem here, but i do only a saveEventually, and this error occurs eventually too. Any solution? – Gabriel Fonseca Jul 08 '15 at 14:09
  • Cannot verify it yet, but had a pointer object in my class that got saved using saveEventually just before saving the object. They got saved right after each other. Now I wait for the first save to complete before saving the second object. Have not gotten it since but also not tested extensively – cYrixmorten Jul 08 '15 at 14:44

0 Answers0