Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
Android 活动泄漏_Android_Android Activity_Memory Leaks - Fatal编程技术网

Android 活动泄漏

Android 活动泄漏,android,android-activity,memory-leaks,Android,Android Activity,Memory Leaks,假设您有一个包含两个活动的应用程序:活动A(启动器),带有启动活动B的按钮。重要的活动B代码是: final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceSt

假设您有一个包含两个活动的应用程序:活动A(启动器),带有启动活动B的按钮。重要的活动B代码是:

final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();

@Override
protected void onCreate( Bundle savedInstanceState )
{
    super.onCreate( savedInstanceState );
    setContentView(....);
    Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler()
    {
        @Override
        public void uncaughtException( Thread thread, Throwable ex )
        {
        }
    });
}

活动B为其接口加载一些位图。它不会在退出时还原旧的默认未捕获异常处理程序。正在执行A->B->A->B。。。由于活动B泄漏,导致内存不足异常。为什么活动B会泄漏?

在我看来,这是错误的体系结构。对于链式搜索,每个
活动都应该只有一个实例。您应该通过调用
startActivity()
并在您使用的
Intent
中设置
Intent.FLAG\u Activity\u REORDER\u TO\u FRONT
在不同的
Activity
实例之间切换。还可以在
Intent
中添加要显示为“额外”的数据

为了能够使用“后退”按钮返回整个链(无论它有多长),每个
活动
都应该管理一个堆栈,其中包含每当用户返回页面时重新创建页面所需的数据。在
onCreate()
onNewIntent()
中,应将数据(来自“extras”)推送到堆栈上并显示。然后,通过调用
startActivity()
,并在所使用的
Intent
中设置
Intent.FLAG\u Activity\u REORDER\u to \u FRONT
来覆盖
onBackPressed()
,并返回到上一个
活动。您还可以在
意图中添加一个“额外”来表示用户想要“返回”。在
onBackPressed()
中,您还应该丢弃剩下的
活动
数据堆栈的顶部元素。这将确保当用户返回此
活动时堆栈是正确的

onNewIntent()
中,如果用户刚刚返回到
活动
,您只需显示已位于托管数据堆栈顶部的数据

通过这种方式,每个
活动只有一个实例,用户可以整天通过一组活动进行链接,后退按钮始终有效,您不必担心内存不足

尝试使用
taskAffinity
Intent
标志或类似标志来完成此操作将无效。不要浪费你的时间。这也是一种糟糕的编程风格

我希望这是清楚的。 对于内存异常,请使用添加清单

android>v3

<application
    ....
       android:largeHeap="true">