Loop in value animator cause in crash with java.lang.StackOverflowError: stack size 8MB

Loop in value animator cause in crash with java.lang.StackOverflowError: stack size 8MB

我使用两个值的动画,在一个结束时开始另一个。它在我测试过的设备上运行良好,但在许多实时设备上得到 java.lang.WhosebugError: stack size 8MB

这就是我使用 value animator 的方式:

 ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
 ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);

    fadeIn.setDuration(300);
    fadeOut.setDuration(300);
    fadeOut.setStartDelay(500);

    fadeIn.start();

    fadeIn.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            fadeOut.start();
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

    fadeOut.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            fadeIn.start();
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

我用谷歌搜索但找不到任何原因和解决方案。有人知道吗?

您应该重复动画而不是在它们之间创建循环依赖。使用 AnimatorSet 来做到这一点:

    AnimatorSet animatorSet = new AnimatorSet();
    ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
    ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
    fadeIn.setDuration(300);
    fadeOut.setDuration(300);
    fadeOut.setStartDelay(500);

    animatorSet.playSequentially(fadeIn, fadeOut);
    animatorSet.setDuration(1100);
    animatorSet.addListener(new AnimatorListenerAdapter() {

        private boolean mCanceled;

        @Override
        public void onAnimationStart(Animator animation) {
            mCanceled = false;
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            mCanceled = true;
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            if (!mCanceled) {
                animation.start();
            }
        }

    });
    animatorSet.start();

结果如下: