java - Android:OutOfMemory 错误和后台堆栈

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

下表表示此问题所涉及的应用程序中的工作流程。

workflow

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

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

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

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

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

提前致谢!

最佳答案

试试这个-

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

另一种解决方案是-

在 list 文件中的 Activity 上设置 android:noHistory="true" 将在导航离开时从堆栈中删除 Activity。

但最合适的方法是在您开始新 Activity 时调用 finish() 方法,如下面的示例代码-

Intent intent = new Intent(this, yourActivity.class);
startActivity(intent);
finish();

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

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

相关文章:

android - 使用 Android 中 ListView 外的删除按钮删除 ListView 中的项目

android - 动态壁纸屏幕旋转

ruby - 无方法错误 : undefined method `start_with?'

java - 如果我将一些小部件放入单个通用 GWT 模块中,GWT 对速度有帮助吗?

java - 为什么我不能在 java 中传递一个短数组到接受 int 数组的方法?

java - 如何使用2个具有相同类名/命名空间的react-native包

c# - 如何在不阻塞的情况下等待一个任务完成后再调用另一个任务?

if-statement - 在单个条件下对多个 ansible 任务进行分组

java - 如何在另一个已激活时加载 FXML?

java - 将外部文件夹添加到可运行 jar 中的 ClassPath