LottieAnimationView mLottieAnimationView.addAnimatorUpdateListener(mAnimatorUpdateListener);
在AnimatorUpdateListener的实现类里面引用activity的控件。
在Activity销毁的时候没有及时监听器导致内存泄漏,所处的activity无法销毁。
处理方法是把监听写错静态的内部类,在静态内部类中持有activity的软引用,使用软引用对activity的控件进行操作
static class AnimUpdateListener implements ValueAnimator.AnimatorUpdateListener{
WeakReference<GuideActivity> mReference;
public AnimUpdateListener(GuideActivity activity){
mReference = new WeakReference<GuideActivity>(activity);
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (!WeakRefUtil.isWeakRefAvailable(mReference)) {
return;
}
GuideActivity mGuideActivity = mReference.get();
if (animation.getAnimatedFraction() >= 0.752f && mGuideActivity.mNextStepIv.getVisibility() != View.VISIBLE){
mGuideActivity.mNextStepIv.setText("我学会了");
}
}
}
}
我采坑是因为在使用软引用的时候,把软引用赋值给一个全局变量,导致出现了强引用,自己还不知道是哪里出了问题,问了大佬之后发现了这个原因。如:
static class AnimListenerAdapter extends AnimatorListenerAdapter {
WeakReference<GuideActivity> mActivityReference;
GuideActivity mGuideActivity;
public AnimListenerAdapter(GuideActivity activity,Stepper stepper){
mActivityReference = new WeakReference<GuideActivity>(activity);
if (WeakRefUtil.isWeakRefAvailable(mActivityReference)){
mGuideActivity = mActivityReference.get();
}
}
@Override
public void onAnimationEnd(Animator animation) {
if (mOperationGuideActivity == null ){
return;
}
mGuideActivity.mAgainIv.setVisibility(View.GONE);
}
@Override
public void onAnimationStart(Animator animation) {
if (mOperationGuideActivity == null){
return;
}
mGuideActivity.mNextStepIv.setVisibility(View.GONE);
}
}
很明显这里的mGuideActivity是全局变量,是个强引用,引用了GuideActivity。
本文探讨了在使用LottieAnimationView时如何避免因AnimatorUpdateListener引起的内存泄漏问题。通过将监听器实现实例化为静态内部类,并采用弱引用方式持有Activity,确保在Activity销毁时不会产生内存泄漏。
3417

被折叠的 条评论
为什么被折叠?



