Activity 10s后才onDestroy

2019-07-17  本文已影响0人  主音King

场景:ActivityA的onResume中开启补间动画(无限循环),跳转到ActivityB中,然后返回到ActivityA,发现ActivityB的onStop和onDestroy 10s后执行。

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("测试-1", "onResume");
        img.setVisibility(View.VISIBLE);
        scaleAnimation = new ScaleAnimation(1f, 1.1f, 1f, 1.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setRepeatCount(-1);
        scaleAnimation.setDuration(1000);
        img.startAnimation(scaleAnimation);
    }

解决办法:
用属性动画代替补间动画

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("测试-1", "onResume");
        animatorSet = new AnimatorSet();
        ObjectAnimator objectAnimatorx = ObjectAnimator.ofFloat(img, "scaleX", 1.0f, 1.1f);
        ObjectAnimator objectAnimatory = ObjectAnimator.ofFloat(img, "scaleY", 1.0f, 1.1f);
        objectAnimatorx.setRepeatCount(Animation.INFINITE);
        objectAnimatory.setRepeatCount(Animation.INFINITE);
        animatorSet.setDuration(1000);
        animatorSet.play(objectAnimatorx).with(objectAnimatory);
        if (animatorSet != null) {
            animatorSet.start();
        }
    }

问题分析:
补间动画:
ScaleAnimation(api1)->Animation
源码分析以及官网查询为何阻塞?没有找到所以然
属性动画:
ObjectAnimator(api11)->ValueAnimator(api11)->Animator(api11)
AnimatorSet(api11)->Animator(api11)
从api分析上来看,属性动画都可以实现补间动画,api11远大于api1,可以认为补间动画应该废弃或者不用吧?

补充:
Fragment在support-v4用的是Animation,在android.app用的是Animator。Animation的执行依赖View的绘制,而Animator是独立的,并不依赖View的绘制,因此View执行不会因View是否在Hierarchy中受到影响。
从侧面反映出一个问题,在onStop和onDestory中操作释放内存是不安全的。可以考虑在onPause中释放内存,根据isFinishing()来判断是否销毁来处理

    @Override
    protected void onPause() {
        super.onPause();
        // isFinishing:true则是正在销毁;false则不是正在销毁(锁屏回后台等操作)
        Log.d("测试-2","onPause:"+isFinishing());
    }

总结:
尽量少用Animation下的ScaleAnimation等补间动画(api1)。
推荐使用Animator下的ObjectAnimator动画(api11)。

上一篇下一篇

猜你喜欢

热点阅读