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() を使用して (最初の競合状態が発生しないか、アサートをコメントアウトしたときに) アクティビティを再作成すると、ちょうど完了したのとまったく同じオブジェクトが返されます! thisonXXX...() メソッドにログインしているのでわかります。

これは、常に新しい 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% 以内しか取得できませんでした。ピーター・カーペンターの功績も認めたいと思います。なぜなら、彼のアイデアが私のアプリを高速化したからです。

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 に答える