Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试应用程序生命周期、销毁和创建_Java_Android_Unit Testing - Fatal编程技术网

Java 测试应用程序生命周期、销毁和创建

Java 测试应用程序生命周期、销毁和创建,java,android,unit-testing,Java,Android,Unit Testing,我需要测试我的应用程序的生命周期及其销毁和重新创建,因为当键盘滑入/滑出(或旋转)时,应用程序会被销毁和重新创建。当它这样做时,我还需要测试内存泄漏 我在教程中看到 然而,这是非常简单的。我的日志似乎表明,调用finish()会生成一个具有不同线程id的后台线程,该线程随后调用onPause()、finish()、onStop()和onDestroy()。我甚至尝试了getInstrumentation().waitForIdleSync()尝试等待后台线程完成,但在测试预期值时仍会得到竞争条件

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

我在教程中看到

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

不仅如此,当它使用getActivity()重新创建活动时(当第一个争用条件未发生或我注释掉断言时),它只返回与我刚刚完成的完全相同的对象!我可以说,因为我在onXXX…()方法中记录了
这个

这与方向旋转/键盘滑动应用程序生命周期不同,后者总是创建新的活动对象


那么,我如何测试这种毁灭/转世场景呢?

我所知道的复制方向改变的唯一方法就是实际执行。(键盘#7键)也许你真正想要的是防止应用程序在方向改变时被终止……)可以通过在活动中重写onConfigurationChanged()函数来实现这一点。请参阅:

我所知道的复制方向更改的唯一方法是实际执行。(键盘#7键)也许你真正想要的是防止应用程序在方向改变时被终止……)可以通过在活动中重写onConfigurationChanged()函数来实现这一点。请看:

好的,我找到了!它涉及大量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()");
}
public void testMemoryLeaks(){
Log.e(标记“-----testMemoryLeaks()”);
getInstrumentation().waitForIdleSync();
gc();
Main mActivity=getActivity();
Log.d(标记“--Extractor.stop()”+mActivity.getExtractor());
mActivity.getExtractor().stop();
getInstrumentation().waitForIdleSync();
gc();
long mem=Runtime.getRuntime().freemory();
Log.d(标记“--freemory:”+mem);
Log.d(标记“--mActivity.finish()”);
mActivity.finish();
getInstrumentation().waitForIdleSync();
Log.d(标记“--setActivity()”);
setActivity(null);
getInstrumentation().waitForIdleSync();
gc();
Log.d(标记“--getActivity()”);
mActivity=getActivity();
assertTrue(mActivity!=null);
Log.d(标记“--Extractor.stop()”+mActivity.getExtractor());
mActivity.getExtractor().stop();
getInstrumentation().waitForIdleSync();
gc();
long memAfter=Runtime.getRuntime().freemory();
Log.d(标记“--freemory:”+memAfter);
assertTrue(“内存泄漏”,mem>memAfter*.70&&mem
好的,我找到了!它涉及大量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()");
}
public void testMemoryLeaks(){
Log.e(标记“-----testMemoryLeaks()”);
getInstrumentation().waitForIdleSync();
gc();
Main mActivity=getActivity();
Log.d(标记“--Extractor.stop()”+mActivity.getExtractor());
mActivity.getExtractor().stop();
getInstrumentation().waitForIdleSync();
gc();
long mem=Runtime.getRuntime().freemory();
Log.d(标记“--freemory:”+mem);
Log.d(标记“--mActivity.finish()”);
mActivity.finish();
getInstrumentation().waitForIdleSync();
Log.d(标记“--setActivity()”);
setActivity(null);
getInstrumentation().waitForIdleSync();
gc();
Log.d(标记“--getActivity()”);
mActivity=getActivity();
assertTrue(mActivity!=null);
Log.d(标记“--Extractor.stop()”+mActivity.getExtractor());
mActivity.getExtractor().stop();
getInstrumentation().waitForIdleSync();
gc();
long memAfter=Runtime.getRuntime().freemory();
Log.d(标记“--freemory:”+memAfter);
assertTrue(“内存泄漏”,mem>memAfter*.70&&mem
什么是键盘#7键?当我尝试键入任何内容时,包括
7
,它将进入搜索。我认为
android:configChanges=“orientation | keyboardHidden”
是一个加速的好主意!但是,我仍然希望使用单元测试来测试生命周期,以确保应用程序在后台被杀死时不会泄漏内存。如果您正在使用模拟器,计算机键盘上的7号键将为您更改模拟器的方向。如果您试图在单元测试中自动执行此操作,则可以尝试myActivity.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);你说键盘7键是什么意思?当我尝试键入任何内容时,包括
7
,它将进入搜索。我认为
android:configChanges=“orientation | keyboardHidden”
是一个加速的好主意!但是,我仍然希望使用单元测试来测试生命周期,以确保应用程序在后台被杀死时不会泄漏内存。如果您正在使用模拟器,计算机键盘上的7号键将为您更改模拟器的方向。如果您试图在单元测试中自动执行此操作,