1

我需要测试我的应用程序生命周期及其销毁和重新创建,因为当键盘滑入/滑出(或旋转)时,应用程序被销毁并重新创建。当它这样做时,我还需要测试内存泄漏。

我在教程中看到http://developer.android.com/tools/testing/activity_test.html#StateManagementTests

Terminate the activity and restart it:
mActivity.finish();
mActivity = this.getActivity();

然而,这是非常简化的。我的日志似乎表明调用finish() 会产生一个具有不同线程ID 的后台线程,然后调用onPause()、finish()、onStop() 和onDestroy()。我什getInstrumentation().waitForIdleSync();至尝试等待该后台线程完成,但是当我测试预期值时,我仍然会遇到竞争条件。

不仅如此,当它使用 getActivity() 重新创建 Activity 时(当第一个竞争条件没有发生或我注释掉断言时),它只会返回与我刚刚完成的完全相同的对象!我可以说是因为我登录this了我的 onXXX...() 方法。

这与方向旋转/键盘滑动应用程序生命周期不同,它总是创建一个新的 Activity 对象。

那么如何测试这种破坏/轮回场景呢?

4

2 回答 2

1

我所知道的复制方向变化的唯一方法就是实际去做。(键盘#7 键)也许你真正想要的是防止应用程序在方向改变时被杀死......;)你可以通过覆盖你的活动中的 onConfigurationChanged() 函数来做到这一点。见:http: //developer.android.com/guide/topics/resources/runtime-changes.html

于 2012-10-15T06:13:40.280 回答
0

好的,我找到了!它涉及很多 waitForIdleSync(),因为它是多线程的,并且 setActivity(null)。我只能获得相同内存的 +- 30%。我也想感谢 Peter Carpenter,因为他的想法加速了我的应用程序,我从来没有想过这一点!

public void testMemoryLeaks() {
    Log.e(TAG, "------------ testMemoryLeaks()");
    getInstrumentation().waitForIdleSync();
    System.gc();
    Main mActivity = getActivity();
    Log.d(TAG, "-- Extractor.stop() "+mActivity.getExtractor());
    mActivity.getExtractor().stop();
    getInstrumentation().waitForIdleSync();
    System.gc();
    long mem = Runtime.getRuntime().freeMemory();
    Log.d(TAG, "-- freeMemory: " + mem);
    Log.d(TAG, "-- mActivity.finish()");
    mActivity.finish();
    getInstrumentation().waitForIdleSync();
    Log.d(TAG, "-- setActivity()");
    setActivity(null);
    getInstrumentation().waitForIdleSync();
    System.gc();
    Log.d(TAG, "-- getActivity()");
    mActivity = getActivity();
    assertTrue(mActivity != null);
    Log.d(TAG, "-- Extractor.stop() "+mActivity.getExtractor());
    mActivity.getExtractor().stop();
    getInstrumentation().waitForIdleSync();
    System.gc();
    long memAfter = Runtime.getRuntime().freeMemory();
    Log.d(TAG, "-- freeMemory: " + memAfter);
    assertTrue("Memory leak", mem > memAfter * .70 && mem < memAfter * 1.30);
    mActivity.finish();
    getInstrumentation().waitForIdleSync();
    Log.d(TAG, "-- end testMemoryLeaks()");
}
于 2012-10-18T19:32:28.880 回答