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。