【问题标题】:Espresso test error: AppNotIdleException浓缩咖啡测试错误:AppNotIdleException
【发布时间】:2016-12-15 19:38:21
【问题描述】:

我关闭了开发者选项中的所有动画。 但是当我尝试单击其中一个按钮时,我仍然会遇到此异常。

我的应用确实处于活动状态,并非完全处于空闲状态,但我无法更改它。

android.support.test.espresso.AppNotIdleException: Looped for 6930
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:92)
 at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
 at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
 at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
 at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)

【问题讨论】:

标签: android android-espresso ui-testing


【解决方案1】:

在我的例子中,这个问题发生在AnimatedVectorDrawable 上,是由设置为无限重复动画的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(),如果问题不仅仅发生在旧平台版本上,它会很方便。

【讨论】:

    【解决方案2】:

    过去几天我一直在努力解决这个问题。
    这是我用来识别“违规者”的一种方法:

    private void dumpThreads() {
        int activeCount = Thread.activeCount();
        Thread[] threads = new Thread[activeCount];
        Thread.enumerate(threads);
        for (Thread thread : threads) {
            System.err.println(thread.getName() + ": " + thread.getState());
            for (StackTraceElement stackTraceElement : thread.getStackTrace()) {
                System.err.println("\t" + stackTraceElement);
            }
        }
    }
    

    在我的例子中,Facebook SDK 使用的是 AsyncTask 线程池。

    【讨论】:

    • 您还可以在应用挂起时暂停应用(在调试模式下)并查看所有处于“RUNNING”状态的 AsyncTask。
    • 你是如何处理这个问题的?我有一个类似的问题,我认为是 FacebookInitProvider 发出的调用会停止并导致异常,但无法避免调用。
    【解决方案3】:

    根据answer MaciejGórski 的类似问题:

    这是我的应用程序代码中的一个错误,其中SwipeRefreshLayout 动画 本身无限期。由于a bug in this component, 刷新状态甚至没有显示。

    【讨论】:

    • @Be_Negative 是的,它必须归其合法所有者所有。 ~阿里加托
    • @Be_Negative 但我的布局中没有任何 SwipeRefereshLayout 或 RecyclerView。
    • 你也可以参考这个答案stackoverflow.com/questions/38797738/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多