活动泄露

时间:2017-10-18 11:17:38

标签: android android-activity memory-leaks

假设您有一个包含两个活动的应用:活动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被泄露了?

1 个答案:

答案 0 :(得分:0)

在我看来,这是错误的架构。对于链式搜索,您应该只拥有每个Activity的单个实例。您应该通过调用Activity并在您使用的startActivity()中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT来在不同的Intent个实例之间切换。同时在Intent

中添加要显示为“extras”的数据

为了能够使用BACK按钮返回链(无论多长时间),每个Activity应该管理一个堆栈,其中包含每当用户后退时重新创建页面所需的数据进去。在onCreate()onNewIntent()中,数据(来自“extras”)应该被压入堆栈并显示。然后,您可以覆盖onBackPressed()并通过调用Activity并在您使用的startActivity()中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT来返回上一个Intent。您还可以向Intent添加一个“额外”,表示用户想要“返回”。在onBackPressed()中,您还应该丢弃剩余的Activity数据堆栈中的顶部元素。这将确保当用户返回到此Activity时,堆栈是正确的。

onNewIntent()中,如果用户刚刚进入Activity,您只需显示已存在于托管数据堆栈顶部的数据。

通过这种方式,您只有一个Activity个实例,用户可以整天通过一系列活动链接,并且BACK按钮始终有效,您不必担心用完存储器中。

尝试使用taskAffinityIntent标记或类似标记来完成此操作将无效。不要浪费你的时间。编程风格也不好。

我希望这很清楚。 并且对于内存异常使用
添加清单

android> V3

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