重新创建 activity 导致内存不足错误

Recreating activity cause Out Of Memory error

我正在尝试在运行时更改 activity 的样式。

但是我在重新创建过程中遇到了使用内存增加的问题activity。

为了改变风格,我定义了一些主题并在 activity:

中为它们初始化 int array
private int themes[] = new int[]{R.style.AppThemeOrange, R.style.AppThemeTeal,...};

为了设置下一个主题,我在首选项中保存了主题 ID 并重新启动 activity。然后在 onCreate 方法中,我从首选项设置主题:

setTheme(PreferencesManager.getInstance().getAppTheme());

这是我更改主题的方法:

public void changeTheme() {
    PreferencesManager.getInstance().setAppTheme(themes[(getCurrentThemePos() + 1) % themes.length]);
    recreate();
}

每次重新创建后 activity 分配的内存堆都会增加 0.1-0.2mb 的某个值。因此,如果我多次更改应用主题,我将收到 Out Of Memory 错误。这是我的内存监视器:

memory monitor screen

仅在更改主题 1 分钟后,我才将内存堆从 10 MB 增加到 25 MB。 我尝试使用意图将 recreate() 替换为重新启动 activity,但结果是一样的:

public void changeTheme() {
    PreferencesManager.getInstance().setAppTheme(themes[(getCurrentThemePos() + 1) % themes.length]);
    Intent intent = new Intent(getApplicationContext(), UsersActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    finish();
}

我还尝试了 AndroidManifest 中的所有可用值 launchMode。没有效果。 我将所有出现的 "this" 更改为 "getApplicationContext()"。在 xml 文件中只留下根布局。 这里有一个similar problem。但是那里有两个活动。就我而言,如果我使用

Intent i = new Intent(getApplicationContext(), UsersActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

activity 不会重新创建,因为它已经可见,并且不会调用 onCreate() 并且主题不会更改。 我还尝试在 onDestroy() 中调用 System.gc();,但内存使用量还是增加了。

这是我的 styles.xml 文件的片段:

<style name="ChangebleTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    <item name="editTextStyle">@style/EditTextStyle</item>
    <item name="android:buttonStyle">@style/ButtonStyle</item>
    <item name="buttonStyle">@style/ButtonStyle</item>
    <item name="android:checkboxStyle">@style/CheckboxStyle</item>
    <item name="checkboxStyle">@style/CheckboxStyle</item>
    <item name="switchStyle">@style/SwitchStyle</item>
    <item name="alertDialogProTheme">@style/Theme.AlertDialogPro.Material.Light</item>
</style>

<style name="AppThemeOrange" parent="ChangebleTheme">
    <item name="main_theme_color">@color/colorAccentOrange</item>
    <item name="main_theme_color_dark">@color/colorAccentDarkOrange</item>
    <item name="colorAccent">@color/colorAccentOrange</item>
    <item name="colorPrimaryDark">@color/colorAccentDarkOrange</item>
    <item name="android:navigationBarColor">@color/colorAccentOrange</item>
    <item name="ab_divider_style">@style/AppThemeOrange.ActionBarDivider</item>
</style>

<style name="AppThemeTeal" parent="ChangebleTheme">
    <item name="main_theme_color">@color/colorAccentTeal</item>
    <item name="main_theme_color_dark">@color/colorAccentDarkTeal</item>
    <item name="colorAccent">@color/colorAccentTeal</item>
    <item name="colorPrimaryDark">@color/colorAccentDarkTeal</item>
    <item name="android:navigationBarColor">@color/colorAccentTeal</item>
    <item name="ab_divider_style">@style/AppThemeTeal.ActionBarDivider</item>
</style>

问题:

有人可以告诉我我做错了什么吗?我怎样才能防止增加内存使用量?或者也许有更好的方法在运行时更改应用程序的样式?

提前致谢!

感谢大家的帮助!

在详细代码审查期间,我发现了 2 个导致内存泄漏的原因:

1) 在我的 xml 文件中,我使用了第 3 方视图 (AVLoadingIndicatorView),它不会在 onDetachedFromWindow() 方法中删除动画师。我还发现另外一些第3方进度条在分离后不清除动画。

2) 我在适配器内部有处理程序(这都是我的疏忽 :( ) 在销毁 activity.

之前我没有停下来清除