美文网首页
Activity 10s后才onDestroy

Activity 10s后才onDestroy

作者: 主音King | 来源:发表于2019-07-17 13:35 被阅读0次

    场景: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)。

    相关文章

      网友评论

          本文标题:Activity 10s后才onDestroy

          本文链接:https://www.haomeiwen.com/subject/yvjqlctx.html