java - Android:OutOfMemory 错误和 backstack

原文 标签 java android task out-of-memory heap-memory

下面的表格代表了这个问题所涉及的应用程序中的工作流程。

workflow

我遇到了 OutOfMemory 错误的问题,主要是因为用户能够多次从 Activity B 切换到 Activity D(他们每次尝试都显示不同的内容),而不会破坏之前的 Activity 。这导致了一个非常大的 backstack,导致 OutOfMemory 错误。

为了避免这种情况,我按照建议将父 Activity 添加到 list 并使用 TaskStackBuilder 类创建新的后台堆栈:

void openDFromB()
{
    Intent i = new Intent(this, ActivityD.class);
    TaskStackBuilder.create(this)
        .addParentStack(ActivityD.class)
        .addNextIntent(i)
        .startActivities();
}

如果用户现在从 Activity B 切换到 Activity D,则 MainMenu、A 和 B 将被销毁并创建一个新的 Backstack (MainMenu, C, D)。
这解决了 api 级别大于 10 的内存问题,但不幸的是,TaskStackBuilder 不会为 api 11 之前的设备创建后台堆栈。

知道如何避免用户在 api 11 之前堆积无限数量的 Activity 吗?这是可能的,还是我应该尝试在 onPause 中释放尽可能多的资源以在 OoM 之前获得最大数量的堆叠 Activity ?

提前致谢!

最佳答案

试试这个-

Intent intent = new Intent(getApplicationContext(),yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

另一个解决方案是——

设置 android:noHistory="true"在您的 list 文件中的 Activity 上,只要导航离开,就会从堆栈中删除 Activity 。

但最合适的方式是调用finish()每当您开始新 Activity 时的方法,如以下示例代码中所示 -
Intent intent = new Intent(this, yourActivity.class);
startActivity(intent);
finish();

您还可以创建自定义广播接收器并将其注册到可以在您选择的事件中触发的每个 Activity 中。 For more help you can check this link .

关于java - Android:OutOfMemory 错误和 backstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20469023/

相关文章:

android - 从Android将文件发布到服务器-MultipartEntityBuilder-HTTP

android - 如何在 Android 应用程序中集成 Google Analytics

multithreading - Thread.Sleep 'breaks'任务

java - 检测JSpinner按钮事件

android - URL链接Cardboard和youtube Android

c# - 在另一个任务中启动任务正在复制我的WebRequests

c# - Task.ContinueWith 执行顺序

java - EJB3 - 通过注入(inject)与查找获取 bean - 有什么区别、含义和问题?

java - 如何在 Linux 中测量特定端口的传输速度? (位每秒)

java - 根据这六个字符分割字符串0102 **