jjoe64 / GraphView

Android Graph Library for creating zoomable and scrollable line and bar graphs.
https://github.com/jjoe64/GraphView/wiki
Other
2.75k stars 811 forks source link

Sometimes my app crashes with the following stacktrace #668

Open mahaju opened 4 years ago

mahaju commented 4 years ago

I update the graph every 50 milliseconds using a Runnable and Handler

If my app crashes, most of the time it happens few seconds after the graph starts updating

Most of the time, the program runs without any problems

In rare cases, the app crashes after letting it run for a few minutes

This is the stacktrace I get if the app crashes:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.app.myapp, PID: 11831
    java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.next(ArrayList.java:860)
        at com.jjoe64.graphview.series.LineGraphSeries.draw(LineGraphSeries.java:263)
        at com.jjoe64.graphview.GraphView.drawGraphElements(GraphView.java:309)
        at com.jjoe64.graphview.GraphView.onDraw(GraphView.java:336)
        at android.view.View.draw(View.java:20373)
        at android.view.View.updateDisplayListIfDirty(View.java:19318)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4405)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4385)
        at android.view.View.updateDisplayListIfDirty(View.java:19277)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:800)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:3496)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3283)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2818)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1780)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7827)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

In most cases, if the app crashes at the beginning of the program (that is, few seconds after the graph start updating), just redownloading from Android Studio and running again usually works

How can I debug the cause of this crash?