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();
}
}