2012-10-15 43 views
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();來嘗試等待後臺線程完成,但是當我測試期望值時,我仍然遇到競爭條件。

不僅如此,但是當它重新創建Activity(當第一個競爭條件沒有發生或我註釋掉斷言)時,使用getActivity(),它只返回與我剛剛相同的對象完了!我可以告訴,因爲我在我的onXXX ...()方法中記錄了this

這不同於取向旋轉/鍵盤上滑動的應用程序的生命週期,它總是創建一個新的活動對象。

所以,我怎麼能測試這種破壞/輪迴的場景?

回答

0

好,我找到了!它涉及LOTs的waitForIdleSync(),因爲它是多線程開始的,而setActivity(null)。我只能在相同內存的±30%以內。我也要讚揚彼得卡彭特,因爲他的想法加快了我的應用程序,我永遠不會想到這一點!

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()"); 
} 
+0

任何想法,在什麼條件下,'getInstrumentation()。waitForIdleSync();'會進入無限循環?在運行處理器板的android 4.4.2_r2中,我在執行CTS測試時遇到了這個問題。 – ArunJTS

1

我知道複製方向變化的唯一方法就是實際做到這一點。 (小鍵盤#7鍵)也許你真正要做的是防止應用程序在方向改變時被殺死......;)你可以通過在你的活動中覆蓋onConfigurationChanged()函數來做到這一點。見:http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

你是什麼意思鍵盤#7鍵?當我嘗試輸入任何東西時,包括'7',它都會搜索。我認爲'android:configChanges =「orientation | keyboardHidden」'是加速它的好主意!不過,我仍然想用單元測試來測試生命週期,以確保它在應用程序在後臺死亡時不會泄漏內存。 – Chloe

+1

如果您正在使用模擬器,電腦鍵盤上的數字7鍵將會爲您改變模擬器的方向。如果你想在單元測試中自動執行此操作,可以嘗試myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); –

相關問題