AppNotIdleException из-за AnimatedVectorDrawableCompat

У меня есть следующий анимированный вектор:

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_ventilation" >
    <target
        android:name="fan_group"
        android:animation="@animator/fan_rotation_animation" />
</animated-vector>

Он просто анимировал вентилятор, используя анимацию вращения.

Я устанавливаю этот значок в ImageView и управляю анимацией запуска/остановки, вызывая следующий метод (nnly в Lollipop и выше):

public void setStopped(boolean stopped) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        this.setImageResource(R.drawable.ic_ventilation_animated);
        Drawable drawable = this.getDrawable();
        if (drawable instanceof AnimatedVectorDrawableCompat) {
            if(stopped) {
                ((AnimatedVectorDrawableCompat) drawable).stop();
            } else {
                ((AnimatedVectorDrawableCompat) drawable).start();
            }
        }
    }
}

Но я получаю следующее исключение:

android.support.test.espresso.AppNotIdleException: Looped for 3654 iterations over 60 SECONDS. The following Idle Conditions failed .
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:88)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:51)
at android.support.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:312)
at android.support.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:173)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:114)

Я отключил анимацию в меню параметров разработчика, как описано здесь< /а>. С отключенной анимацией я вижу, что значок больше не анимируется после вызова ((AnimatedVectorDrawableCompat) drawable).start();. Однако возникает исключение.

Есть ли проблема при вызове метода ((AnimatedVectorDrawableCompat) drawable).start(); даже при отключенной анимации? Как я могу это исправить, чтобы я мог запускать свои тесты, не заботясь об анимации?


person amp    schedule 17.02.2019    source источник


Ответы (1)


В моем случае эта проблема была вызвана objectAnimator, который был настроен на бесконечное повторение анимации (android:repeatCount="infinite").

Проблема также присутствовала только на старых версиях платформы. Тесты отлично работали на Android 9, в то время как проблема воспроизводилась на Android 5 и 6 (на данный момент не уверен насчет 7 и 8).

Я считаю, что основная причина проблемы такая же, как и для неопределенных индикаторов выполнения (рассматривается в этом вопросе SO). Однако я не нашел хорошего решения, только обходные пути.

Один из обходных путей — определить, что анимация отключена (продолжительность анимации равна 0) в настройках, и не запускать анимацию. Конечно, это работает только для версий платформы, где анимация не запускается автоматически.

private fun startIconAnimation(imageView: ImageView) {
    if (areAnimationsEnabled()) {
        (imageView.drawable as Animatable).start()
    }
}

private fun areAnimationsEnabled(): Boolean {
    val animatorDurationScale = Settings.Global.getFloat(
        requireContext().contentResolver,
        Settings.Global.ANIMATOR_DURATION_SCALE,
        1.0f
    )
    return animatorDurationScale != 0.0f
}

Примечание. Уровень API 26 представил статический метод ValueAnimator.areAnimatorsEnabled(), который был бы удобен, если бы проблема не возникала только на более старых версиях платформы.

person Josef Adamcik    schedule 21.10.2019