iielse / imageviewer

A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器
MIT License
2.23k stars 310 forks source link

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

Closed githubliangzai closed 3 years ago

githubliangzai commented 3 years ago

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)

iielse commented 3 years ago

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

iielse commented 3 years ago

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

试下这个

githubliangzai commented 3 years ago

大佬威武

githubliangzai commented 3 years ago

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

iielse commented 3 years ago

上面是因为在 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)
            }
        })
    }
githubliangzai commented 3 years ago

好的,麻烦大佬了

iielse commented 3 years ago

怎么样了,小哥,还有吗

iielse commented 3 years ago

有问题再打开

githubliangzai commented 3 years ago

没有再发现崩溃了

iielse commented 3 years ago

ok