【问题标题】:how can you tell when an Android activity is finished loading?如何判断 Android 活动何时完成加载?
【发布时间】:2010-01-18 21:51:21
【问题描述】:

我正在为我们的 Android 应用开发自动化测试套件,但在等待 Activity 完全加载时遇到了麻烦。我可以调用 getActivity,但仅仅因为它显示了我希望在我的测试中看到的活动,并不总是意味着活动的组件已准备好使用(完全加载)。查看 Activity API 并没有发现任何问题,并且其他方法似乎过于侵入性并且破坏了测试的初始状态。有谁知道是否有办法询问应用程序或虚拟机是否加载了当前活动?

【问题讨论】:

    标签: android view android-activity loaded


    【解决方案1】:

    正如我在a comment 中提到的,在onCreate() 早期调用setContentView() 之后,您的视图层次结构应该可以正常工作。我从来没有在任何活动或测试课程中遇到过这样的问题..

    我不确定这对这种特定情况有任何帮助,但通常您可以通过调用getInstrumentation().waitForIdleSync() 来确定 UI 事件队列何时为空。这将一直阻塞,直到没有更多 UI 事件需要处理。

    【讨论】:

    • 我认为我们的问题是吐司元素影响了时间。您的第二个建议是我想进一步研究的,但看起来它需要我们从 InstrumentationTestCase 类扩展。有没有其他方法可以在不扩展您所知道的情况下获得仪器优势?
    • 您的 Toast 是在哪里调用的?您目前正在扩展什么课程?
    • 我们的 toast 主要是通过匿名内部类从活动中调用的,这些内部类实现了一个抽象的异步任务类,用于简单的错误/成功消息传递。我们的测试类从一个父类扩展而来,该父类从 junit 和 hamcrest 导入而没有扩展,我认为我们希望以这种方式不固定它。我看不到任何其他方式可以连接到仪表功能。如果有请告诉我。否则,如果有另一种使用 toast 的方法可以防止它引起这个问题,那也很好。谢谢:)
    • 以异步方式调用 Toast 会导致任何问题似乎很奇怪。如果您没有扩展AndroidTestCaseActivityTestCase,我完全不确定您是如何正确启动Activity 的。您能否用代码 sn-p 或其他内容更新您的问题?
    • 祝酒词似乎每次都花费不同的时间,尽管这可能不是描述那里发生的事情的最佳方式。它们似乎以不可预知的方式集中注意力,但我需要更多地阅读它们。我们的测试设置有点不同。我们既有单元测试,也有我们所说的故事测试。由于我们不想使用应用程序部署故事测试,而是希望能够执行功能流的黑盒测试,因此我们创建了一种通过命令设置远程控制它的方法。它工作得很好,除了这个时间问题:(我将查看 Instrumentation 代码以获取线索。
    【解决方案2】:

    如果您在扩展ActivityInstrumentationTestCase2<MyActivity> 的测试用例中创建这样的setUp() 方法

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    
        final MyActivity activity = getActivity();
    
        tv1 = (EditNumber)activity.findViewById(resId1);
        tv2 = (EditNumber)activity.findViewById(resId2);
    }
    

    您的 Activity 将完全运行并加载布局,在这种情况下,您可以访问视图及其内容这一事实证明了这一点

    @SmallTest
    public void testSimpleCreate() {
        final MyActivity activity = getActivity();
        assertNotNull(activity);
    
        assertNotNull(tv1);
        assertEquals("mystr1", tv1.getText().toString());
        assertNotNull(tv1);
        assertEquals("mystr2", tv2.getText().toString());
    }
    

    【讨论】:

    • 上面这个建议是我问题的症结所在。我目前可以在应用程序中查询当前活动,但即使在当前活动与我正在等待的活动匹配之后,调用 findViewById 也会经常失败(似乎是因为虽然活动位于活动堆栈的顶部,但并非所有视图已加载。)我们的直接解决方案是在测试代码中放置睡眠,但这也很脆弱,因为有时我们的睡眠不够困。
    • 虽然我确实在 logcat 日志中看到 ActivityManager 表示给定的活动现在已“显示”。我不知道这是否意味着该活动现在已完全加载并准备好被滥用,而且我也不知道如何以编程方式获取该信息。感谢大家对此的帮助。如果我在 dtmilano 上面列出的示例中遗漏了什么,请告诉我(这不是第一次!)
    • setContentView() 之后,您的视图层次结构中应该可以访问所有内容。我想说唯一的例外是异步加载的视图,例如 ListView 的各个行被绑定到数据源。
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多