AppNotIdleException由于AnimatedVectorDrawableCompat

时间:2019-02-17 15:35:50

标签: android android-animation android-vectordrawable

我有以下可绘制的动画矢量:

<?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中设置此图标,并控制开始/停止动画,调用以下方法(在Lollipop中为nnly,高):

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)

我已在开发人员选项菜单中禁用了动画,如说明的here。 在禁用动画的情况下,我看到调用((AnimatedVectorDrawableCompat) drawable).start();后该图标不再动画。但是,出现了例外。

即使禁用了动画,调用((AnimatedVectorDrawableCompat) drawable).start();方法时是否存在问题?我该如何解决此问题,以便无需担心动画就可以运行测试?

1 个答案:

答案 0 :(得分:0)

在我的情况下,此问题是由设置为无限重复播放动画(objectAnimator)的android:repeatCount="infinite"引起的。

仅在较旧的平台版本上也存在此问题。测试可以在Android 9上正常运行,而问题可以在Android 5和6上重现(目前不确定是7和8)。

我相信,问题的根本原因与不确定的进度条(covered in this SO question)相同。但是,我没有找到任何好的解决方案,只有解决方法。

一种解决方法是检测设置中的动画已关闭(动画时间为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(),如果问题仅在较旧的平台版本上没有发生,该方法将很方便。