Android-приложение, использующее процессор, когда приложение закрыто назад или дома - анимация в ViewPager

У меня есть приложение, которое имеет анимацию во фрагментах в ViewPager. У меня ViewPager отображается на пустую опцию фрагмента списка. Анимации - это объектные аниматоры NineOldAndroids, объединенные в наборы Animator, некоторые из которых анимируют SVG, показанные с помощью svg-android.

Когда я изменяю страницу в ViewPager, анимации перестают использовать этот код во фрагменте:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) { 
        if (myAnimationView != null) {
            myAnimationView.restartAnimation();
        }
    } else { 
        if (myAnimationView != null) {
            myAnimationView.stopAnimation();
        } 
    }
}

И этот код в представлении реализует ValueAnimator.AnimatorUpdateListener:

    public void stopAnimation() {
        endAnimCalled = true;
        myAnimatorSet.end(); 
    }

    public void restartAnimation() {
        endAnimCalled = false;
        if (!myAnimatorSet.isStarted()) {
            myAnimatorSet.start();
        }
    } 

Если нажать кнопку "Назад", чтобы выйти, когда страница анимации отсутствует, приложение использует процессор на 1–5% даже через несколько часов. Если при анимации на странице нажата кнопка "Назад", приложение работает в фоновом режиме на 10–30%.

Есть хороший способ пройти через фрагменты, которые были вызваны onPause? Есть идеи, почему приложение по-прежнему использует 1-5% ЦП, когда анимация остановлена?

Я обнаружил, что это невозможно воспроизвести в приложении, достаточно маленьком, чтобы его можно было разместить на Stack Exchange.

1 ответ

Убедиться, что анимация заканчивается, - единственное решение, которое я нашел для использования процессора. Я установил только повтор анимации 10 раз. Я также рассмотрел возможность использования BroadcastReceiver для передачи широковещательной передачи от onPause() действия для вызова endAnimation() во фрагментах.

    public void startAnimation() {
        createAnimation();
        animRepeats = 0;
        if (!myAnimatorSet.isStarted()) {
            myAnimatorSet.start();
        }
        AnimatorListener myAnimListen = new AnimatorListener() {
            @Override
            public void onAnimationEnd(Animator animator) {
                if (!endAnimCalled && animRepeats < 10) {
                    myAnimatorSet.start();  
                    animRepeats++;
                }
            }
            @Override public void onAnimationRepeat(Animator animator) {}
            @Override public void onAnimationStart(Animator animator) {}
            @Override public void onAnimationCancel(Animator animation) {}
        };

        myAnimatorSet.addListener(myAnimListen);
    }

    public void stopAnimation() {
        endAnimCalled = true;
        myAnimatorSet.end(); 
    }

    public void restartAnimation() {
        endAnimCalled = false;
        if (!myAnimatorSet.isStarted()) {
            animRepeats = 0;
            myAnimatorSet.start();
        }
    }
Другие вопросы по тегам