ChromeLikeTabSwitcher icon indicating copy to clipboard operation
ChromeLikeTabSwitcher copied to clipboard

Crash when scrolling large numbers of tabs and saving/restoring state

Open dbrant opened this issue 5 years ago • 1 comments

When there is a large number of tabs (e.g. 100), fling-scrolling the list and invoking the app switcher can sometimes cause another crash. This has also been observed in other situations where the state was saved and restored (e.g. turning the display off and on after a while).

ezgif-4-3620a6dfbe70

Stack trace:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:4937)
        at android.view.ViewGroup.addView(ViewGroup.java:4768)
        at android.view.ViewGroup.addView(ViewGroup.java:4708)
        at de.mrapp.android.util.view.AttachedViewRecycler.inflate(AttachedViewRecycler.java:286)
        at de.mrapp.android.util.view.AbstractViewRecycler.inflate(AbstractViewRecycler.java:362)
        at de.mrapp.android.tabswitcher.layout.AbstractTabSwitcherLayout.inflateView(AbstractTabSwitcherLayout.java:1068)
        at de.mrapp.android.tabswitcher.layout.phone.PhoneTabSwitcherLayout.inflateAndUpdateView(PhoneTabSwitcherLayout.java:3035)
        at de.mrapp.android.tabswitcher.layout.AbstractTabSwitcherLayout.inflateOrRemoveView(AbstractTabSwitcherLayout.java:1043)
        at de.mrapp.android.tabswitcher.layout.AbstractTabSwitcherLayout.calculatePositionsWhenDraggingToStart(AbstractTabSwitcherLayout.java:714)
        at de.mrapp.android.tabswitcher.layout.AbstractTabSwitcherLayout.onDrag(AbstractTabSwitcherLayout.java:1572)
        at de.mrapp.android.tabswitcher.layout.AbstractDragTabsEventHandler.notifyOnDrag(AbstractDragTabsEventHandler.java:341)
        at de.mrapp.android.tabswitcher.layout.AbstractDragTabsEventHandler.handleDrag(AbstractDragTabsEventHandler.java:675)
        at de.mrapp.android.tabswitcher.layout.AbstractTabSwitcherLayout$FlingAnimation.applyTransformation(AbstractTabSwitcherLayout.java:367)
        at android.view.animation.Animation.getTransformation(Animation.java:879)
        at android.view.animation.Animation.getTransformation(Animation.java:953)
        at android.view.View.applyLegacyAnimation(View.java:18742)
        at android.view.View.draw(View.java:18858)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.updateDisplayListIfDirty(View.java:18133)
        at android.view.View.draw(View.java:18920)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.updateDisplayListIfDirty(View.java:18133)
        at android.view.View.draw(View.java:18920)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.updateDisplayListIfDirty(View.java:18133)
        at android.view.View.draw(View.java:18920)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.updateDisplayListIfDirty(View.java:18133)
        at android.view.View.draw(View.java:18920)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.updateDisplayListIfDirty(View.java:18133)
        at android.view.View.draw(View.java:18920)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4236)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4022)
        at android.view.View.draw(View.java:19195)
        at com.android.internal.policy.DecorView.draw(DecorView.java:788)
        at android.view.View.updateDisplayListIfDirty(View.java:18142)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2992)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2806)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2359)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
        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)
2019-04-16 13:27:58.147 25168-25168/org.wikipedia.dev E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

dbrant avatar Apr 16 '19 18:04 dbrant

I was able to reproduce the crash by turning back on the display after quite some time. But it's hard to do so, because it only occurs rarely...

michael-rapp avatar Apr 30 '19 22:04 michael-rapp