Version: compile 'com.github.PhilJay:MPAndroidChart:v2.1.6'
I was running monkey on an app for 2+ hours and ran into a memory issue with the charting library:
// CRASH: <package> (pid 29580)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError: Failed to allocate a 8431340 byte allocation with 210496 free bytes and 205KB until OOM
// Build Label: google/shamu/shamu:6.0.1/MMB29S/2489379:user/release-keys
// Build Changelist: 2489379
// Build Time: 1450217770000
// java.lang.OutOfMemoryError: Failed to allocate a 8431340 byte allocation with 210496 free bytes and 205KB until OOM
// at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
// at android.graphics.Bitmap.nativeCreate(Native Method)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:831)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:808)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:775)
// at com.github.mikephil.charting.renderer.LineChartRenderer.drawData(LineChartRenderer.java:88)
// at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:247)
// at android.view.View.draw(View.java:16184)
// at android.view.View.updateDisplayListIfDirty(View.java:15180)
// at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
// at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
// at android.view.View.updateDisplayListIfDirty(View.java:15140)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1077)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:1229)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.updateDisplayListIfDirty(View.java:15175)
// at android.view.View.draw(View.java:15954)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
// at android.view.View.draw(View.java:16187)
// at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690)
// at android.view.View.updateDisplayListIfDirty(View.java:15180)
// at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
// at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
// at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
// at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
// at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
// at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
// at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
// at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
// at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
// at android.view.Choreographer.doCallbacks(Choreographer.java:670)
// at android.view.Choreographer.doFrame(Choreographer.java:606)
// at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
// at android.os.Handler.handleCallback(Handler.java:739)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:148)
// at android.app.ActivityThread.main(ActivityThread.java:5417)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
//
** Monkey aborted due to error.
Events injected: 256961
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=814 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=8392464ms (0ms mobile, 0ms wifi, 8392464ms not connected)
** System appears to have crashed at event 256961 of 999999 using seed 5566
Other OOM duplicate errors:
System.gc()chart=null;A lot of people are running into OOM, and that does not surprise me because especially LineChart allocates a lot of memory when drawing with bitmaps.
However, and OOM does not mean that the library has a memory leak. It simply means that it tried to allocate more memory than available at that time.
This could just as well mean that some other part in your application is leaking memory, and the library (beacause it allocates large chunks of memory) is the first thing to crash because of that.
I have focused on the issue for quite some time now, and I believe that the chart does everything it should not to leak memory:
public void releaseBitmap() {
if (mDrawBitmap != null) {
mDrawBitmap.recycle();
mDrawBitmap = null;
}
}
If you have any suggestions where the leak could be in this library (if there is one), please let me know.
Calling System.gc() manually is not good practice at all.
@PhilJay Thanks for your reply! I was trying aggregate all of the issues, cross referencing them to try and find some solution. I will re-run the monkey tests with leak canary and try to trace these memory issues further.
I am currently displaying the LineChart on a Fragment but I am not retaining it or adding it to the stack. I am using replace. I do not want to use System.gc() or increase the app's heap.
Other answers in the issues suggest simply adding chart = null.
Other answers on StackOverflow suggesting "unbinding" all of the views:
private void unbindDrawables(View view)
{
if (view.getBackground() != null)
{
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView))
{
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
{
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Source: http://stackoverflow.com/questions/14759601/proper-ondestroy-how-to-avoid-memory-leaks
The releaseBitmap() method only gets called in onDetachedFromWindow() and I don't see where and when is that method invoked. On the other hand, onDetachedFromWindow() is defined only in LineChart and PieChart, what about other types of charts?
In issue #1197 i think I explained the potential root of the problem, but I don't know how it got ignored for such a long time.
You got ignored for such a long time because I have a life and a job and a university to attend to besides this and about 5 new issues are created every day plus dozens of emails. I'm looking into this.
You are absolutely right. I went out of line there and therefore I apologize. If you need help and want me to jump in with trying to fix it and submitting a pull request, let me know.
I just replaced the standart references to Bitmaps by WeakReference. Could you please try if this makes any difference?
@brcinho I am sure @PhilJay would be more than happy to accept pull request referencing this issue.
@PhilJay Yes, I can test this build. Via jitpack? I am using a different computer at the moment and I can't submit a PR but I believe you should check for null(mDrawBitmap.get() != null every where) on the WeakReference as you are not guaranteed it will be there:
From:
if (mDrawBitmap == null
- || (mDrawBitmap.getWidth() != width)
- || (mDrawBitmap.getHeight() != height)) {
To:
if (mDrawBitmap == null
- || (mDrawBitmap.get() != null && mDrawBitmap.getWidth() != width)
- || (mDrawBitmap.get() != null && mDrawBitmap.getHeight() != height)) {
Yes you can test via jitpack just use the latest commit and not release
@PhilJay I am going to try, https://jitpack.io/#PhilJay/MPAndroidChart/aa5730d19f:
dependencies {
compile 'com.github.PhilJay:MPAndroidChart:aa5730d19f'
}
Hopefully monkey tests can run past 2 hours. I will return with my results.
Awesome, any results yet?
@PhilJay I am able to get LeakCanary to crash the app from too much memory using the monkey binary running an event every single 0.100 a second: adb -d shell monkey -p package --monitor-native-crashes --pct-trackball 0 --pct-nav 0 --pct-appswitch 0 --pct-syskeys 0 --pct-anyevent 0 -s 5566 --throttle 100 -v -v -v 999999 -f and 0.500 a second: adb -d shell monkey -p package --monitor-native-crashes --pct-trackball 0 --pct-nav 0 --pct-appswitch 0 --pct-syskeys 0 --pct-anyevent 0 -s 5566 --throttle 500 -v -v -v 999999 -f
Without LeakCanary, I can get monkey to run for 2hrs+. The reason I mention leak canary is because if it is able to detect memory increases then maybe there is still a memory issue. I honestly believe that if I can get monkey to run 5hrs+ on an app with the LineChart, then we should be fine. I will continue to report back.
@PhilJay I just ran adb monkey and was able to reproduce the memory leak using adb -d shell monkey -p package --monitor-native-crashes --pct-trackball 0 --pct-nav 0 --pct-appswitch 0 --pct-syskeys 0 --pct-anyevent 0 -s 5566 --throttle 100 -v -v -v 999999 -f:
// CRASH: package (pid 6447)
// Short Msg: java.lang.OutOfMemoryError
// Long Msg: java.lang.OutOfMemoryError: Failed to allocate a 4842156 byte allocation with 2271684 free bytes and 2MB until OOM
// Build Label: htc/verizon_wwe/dlx:4.4.2/KOT49H/322791.5:user/release-keys
// Build Changelist: 95cf91ea4d
// Build Time: 1426394589000
// java.lang.OutOfMemoryError: Failed to allocate a 4842156 byte allocation with 2271684 free bytes and 2MB until OOM
// at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
// at android.graphics.Bitmap.nativeCreate(Native Method)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:817)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:794)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:761)
// at package(SourceFile:89)
// at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(SourceFile:247)
// at android.view.View.draw(View.java:15114)
// at android.view.View.updateDisplayListIfDirty(View.java:14048)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3388)
// at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3367)
// at android.view.View.updateDisplayListIfDirty(View.java:14008)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.support.design.widget.CoordinatorLayout.drawChild(SourceFile:1077)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.support.v4.widget.DrawerLayout.drawChild(SourceFile:1229)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.updateDisplayListIfDirty(View.java:14043)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.View.draw(View.java:14838)
// at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
// at android.view.View.draw(View.java:15117)
// at android.widget.FrameLayout.draw(FrameLayout.java:592)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2850)
// at android.view.View.updateDisplayListIfDirty(View.java:14048)
// at android.view.View.getDisplayList(View.java:14071)
// at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:266)
// at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:272)
// at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:311)
// at android.view.ViewRootImpl.draw(ViewRootImpl.java:2499)
// at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2337)
// at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1968)
// at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
// at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
// at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
// at android.view.Choreographer.doCallbacks(Choreographer.java:580)
// at android.view.Choreographer.doFrame(Choreographer.java:550)
// at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
// at android.os.Handler.handleCallback(Handler.java:739)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:135)
// at android.app.ActivityThread.main(ActivityThread.java:5256)
// at java.lang.reflect.Method.invoke(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:372)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
//
** Monkey aborted due to error.
Events injected: 26967
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=199 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=1510034ms (0ms mobile, 0ms wifi, 1510034ms not connected)
** System appears to have crashed at event 26967 of 999999 using seed 5566
In my original post:
// at com.github.mikephil.charting.renderer.LineChartRenderer.drawData(LineChartRenderer.java:88)
// at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:247)
In this post:
// at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(SourceFile:247)
It looks like we need to make the same change you did in the latest commit but in BarLineChartBase as well. I am not seeing am Bitmaps in here: https://github.com/PhilJay/MPAndroidChart/blob/090df226e03bb7de32bee7dbaaa180f1e8a50fa7/MPChartLib/src/com/github/mikephil/charting/charts/BarLineChartBase.java#L247.
This build was using proguard as well. I mapped the package line to com.github.mikephil.charting.renderer.LineChartRenderer which is where we create the new WeakReference : https://github.com/PhilJay/MPAndroidChart/blob/aa5730d19f01ba5d37c348b3bdfa17c5e8e66d07/MPChartLib/src/com/github/mikephil/charting/renderer/LineChartRenderer.java#L89.
Just now, only 30mins+ the monkey, I was able to get my application to ANR:
----- end 232 -----
// anr traces status was 0
meminfo:
Applications Memory Usage (kB):
Uptime: 6942369 Realtime: 6942357
Total PSS by process:
208243 kB: package (pid 17716 / activities) <----
89164 kB: system (pid 540)
57887 kB: com.android.systemui (pid 759)
@PhilJay I am trying to give as much information as possible. Is there anything I can try or do on my side? Should I try "removing all views" in onDestroy? Should I invalidate the graph in onDestroy? Should I remove all data sets entry points in onDestroy?
I'm not sure tbh.
From my side I don't know what else to do.
Are you absolutely sure your own code is not leaking anywhere else?
Again: OOM-Exception just means that there was not enough memory to allocate the needed space. The cause of OOM is not neccessarily the cause of a (the) memory leak.
A perfectly fine component can cause an OOM even though somewhere else is the actual memory leak.
Submitted a pull request, it is my first :smile: so if I did something wrong let me know.
As I wrote in the comment, I don't know which code change contributed more, whether settings canvas and its reference to bitmap to null or pinging system to perform garbage collection.
I don't know also if calling gc() is a bad thing and can do something wrong. As I understood, it is an instruction to jvm that gc() should be performed, and not an explicit call to garbage collection, so maybe it really can not do any harm. Your call.
Results can be observed here performed by manual testing by opening and closing Line Chart (or Pie Chart) form in example app around 50 times as fast as possible:
Before changes: Version before changes: compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'

After changes:

hello few question
Thanks That's worked for me android:largeHeap="true"
I'm Still facing OutOfMemory Issue in latest version
java.lang.OutOfMemoryError: Failed to allocate a 301989896 byte allocation with 16777216 free bytes and 225MB until OOM
at java.util.Arrays.copyOf(Arrays.java:3352)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:417)
at java.lang.StringBuffer.append(StringBuffer.java:237)
at com.github.mikephil.charting.formatter.DefaultAxisValueFormatter.<init>(DefaultAxisValueFormatter.java:36)
at com.github.mikephil.charting.components.AxisBase.getValueFormatter(AxisBase.java:519)
at com.github.mikephil.charting.components.AxisBase.getFormattedLabel(AxisBase.java:489)
at com.github.mikephil.charting.components.AxisBase.getLongestLabel(AxisBase.java:475)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeSize(XAxisRenderer.java:79)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxisValues(XAxisRenderer.java:74)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxis(XAxisRenderer.java:67)
at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:209)
at android.view.View.draw(View.java:17086)
at android.view.View.updateDisplayListIfDirty(View.java:16068)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.draw(View.java:17089)
at android.view.View.updateDisplayListIfDirty(View.java:16068)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.updateDisplayListIfDirty(View.java:16063)
at android.view.View.draw(View.java:16852)
at android.view.ViewGroup.drawChild(ViewGroup.java:3768)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3554)
at android.view.View.draw(View.java:17089)
at com.android.internal.policy.DecorView.draw(DecorView.java:751)
at android.view.View.updateDisplayListIfDirty(View.java:16068)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:657)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:663)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:771)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2808)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2616)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2223)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1258)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6348)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Most helpful comment
You got ignored for such a long time because I have a life and a job and a university to attend to besides this and about 5 new issues are created every day plus dozens of emails. I'm looking into this.