【问题标题】:Activity leaked活动泄露
【发布时间】:2017-10-18 11:17:38
【问题描述】:

假设您有一个包含两个活动的应用程序:活动 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 )
        {
        }
    });
}

Activity B 为其界面加载一些位图。它不会在退出时恢复旧的默认未捕获异常处理程序。执行 A->B->A->B... 会导致内存不足异常,因为活动 B 已泄漏。为什么活动 B 会被泄露?

【问题讨论】:

    标签: android android-activity memory-leaks


    【解决方案1】:

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

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

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

    通过这种方式,每个Activity 都只有一个实例,用户可以整天链接一组活动,并且“返回”按钮始终有效,您不必担心内存不足。

    尝试使用 taskAffinityIntent 标志或类似标志来完成此操作是行不通的。不要浪费你的时间。这也是糟糕的编程风格。

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

    安卓 > v3

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 2012-08-13
      • 2015-01-27
      • 2012-06-02
      • 1970-01-01
      相关资源
      最近更新 更多