ethanhua / Skeleton

A library provides an easy way to show skeleton loading view like Facebook and Alipay
3.67k stars 455 forks source link

【内存泄漏】 ShimmerLayout #addUpdateListener #60

Open Stars-FC opened 3 years ago

Stars-FC commented 3 years ago

该库已经不维护了,遇到问题很难搞。分享下遇到内存泄漏问题、产生原因及解决办法。 (由 https://github.com/team-supercharge/ShimmerLayout 库产生的内存泄漏)

内存泄漏的具体路径: image

场景:RecyclerView + Skeleton + 弹起的软键盘(这个很重要) 原因: 1、SkeletonAdapter 中开启了ShimmerLayout动画,交由ShimmerLayout的onDetachedFromWindow()方法自己去移除动画监听。但在软键盘弹起情况下,被软键盘盖住View的onDetachedFromWindow()方法会在onAttachedToWindow()方法后立即回调,导致该View的动画监听没有被移除,进而导致泄漏。

解决思路: 1、SkeletonAdapter中使用了ShimmerLayout.startShimmerAnimation()方法,却没有手动调用 stopShimmerAnimation方法来移除相关监听。 2、ShimmerLayout 中如果已经回调了onDetachedFromWindow,就不需要再为他启动动画。

` /**

我采用了思路2来解决该问题(可能不是最好的解决方式,但解决了我的问题)。 建议:思路1中提到的,调用了startShimmerAnimation应该主动去调用stopShimmerAnimation方法来清除相关监听,而不是只交给View自身去处理,因为你不能确保View内会不会处理好。

———————————————————— 如果你的项目还在使用该库并遇到该问题,希望能帮到你。