iielse/imageviewer

线上崩溃java.lang.IllegalStateException Fragment FullScreenImageViewerDialogFragment{2998a4f} (e029c2a1-c25e-4b63-a883-22f4197f941f) not associated with a fragment manager.

githubliangzai opened this issue · 10 comments

main(1)

java.lang.IllegalStateException

Fragment FullScreenImageViewerDialogFragment{2998a4f} (e029c2a1-c25e-4b63-a883-22f4197f941f) not associated with a fragment manager.

解析原始
1
androidx.fragment.app.Fragment.getParentFragmentManager(Fragment.java:1040)
2
androidx.fragment.app.DialogFragment.dismissInternal(DialogFragment.java:350)
3
androidx.fragment.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:317)
4
com.github.iielse.imageviewer.utils.TransitionEndHelper$end$doTransition$1$1$1.onTransitionEnd(TransitionEndHelper.kt:34)
5
androidx.transition.Transition.end(Transition.java:1952)
6
androidx.transition.TransitionSet$TransitionSetListener.onTransitionEnd(TransitionSet.java:451)
7
androidx.transition.Transition.end(Transition.java:1952)
8
androidx.transition.Transition$3.onAnimationEnd(Transition.java:1901)
9
android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:554)
10
android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1242)
11
android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1484)
12
android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
13
android.animation.AnimationHandler.access$100(AnimationHandler.java:37)
14
android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
15
android.view.Choreographer$CallbackRecord.run(Choreographer.java:1055)
16
android.view.Choreographer.doCallbacks(Choreographer.java:875)
17
android.view.Choreographer.doFrame(Choreographer.java:772)
18
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1042)
19
android.os.Handler.handleCallback(Handler.java:888)
20
android.os.Handler.dispatchMessage(Handler.java:100)
21
android.os.Looper.loop(Looper.java:213)
22
android.app.ActivityThread.main(ActivityThread.java:8178)
23
java.lang.reflect.Method.invoke(Native Method)
24
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
25
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)

bug 我这边 复现了,应该找到原因了, 马上解决

implementation 'com.github.iielse:imageviewer:2.1.8'

试下这个

大佬威武

已经用最新的版本了,我再观察下还会不会崩溃,具体原因是啥额,是执行退出动画的时候DialogFragment被销毁了么,但是什么情况下会导致执行退出动画时DialogFragment被销毁呢

上面是因为在 dialogFragment onDestroyView后了, 还在调用 fragment.dismissAllowingStateLoss() 崩溃的. 我自测是在 onRelease方法中直接调用 activity.finish() 触发了的.

解决方案是监听 fragment的声明周期,onDestroyView后加个标记.

fun end(fragment: DialogFragment, startView: View?, holder: RecyclerView.ViewHolder) {
        beforeTransition(startView, holder)
        val doTransition = {
            TransitionManager.beginDelayedTransition(holder.itemView as ViewGroup, transitionSet().also {
                it.addListener(object : TransitionListenerAdapter() {
                    override fun onTransitionStart(transition: Transition) {
                        animating = true
                    }

                    override fun onTransitionEnd(transition: Transition) {
                        if (!animating) return  // 这里
                        animating = false 
                        fragment.dismissAllowingStateLoss()
                    }
                })
            })
            transition(startView, holder)
        }
        holder.itemView.post(doTransition)

        fragment.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun onDestroy() {
                fragment.lifecycle.removeObserver(this)
                animating = false // 这里
                holder.itemView.removeCallbacks(doTransition)
                TransitionManager.endTransitions(holder.itemView as ViewGroup)
            }
        })
    }

好的,麻烦大佬了

怎么样了,小哥,还有吗

有问题再打开

没有再发现崩溃了

ok