重新创建活动会导致内存不足错误

时间:2016-06-21 15:13:55

标签: android memory-management memory-leaks out-of-memory android-theme

我试图在运行时改变活动的风格。

但是我在重新创建活动时遇到了增加使用内存的问题。

为了改变风格,我定义了一些主题,并在活动中为它们初始化int array

private int themes[] = new int[]{R.style.AppThemeOrange, R.style.AppThemeTeal,...};

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

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

以下是我更改主题的方法:

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

每次重新创建活动后,分配的内存堆增加了一些值0.1-0.2mb。因此,如果我多次更改应用主题,我会收到Out Of Memory错误。这是我的记忆监控器:

memory monitor screen

仅在1分钟更改主题后,我将内存堆从10增加到25 mb。 我尝试使用intent替换recreate()重新启动活动,但结果是相同的:

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();
}

此外,我在launchMode中尝试了所有可用的值AndroidManifest。没有效果。 我改变了所有出现的"这个" to" getApplicationContext()"。在xml文件中只留下根布局。 这是一个similar problem。但那里有两项活动。在我的情况下,如果我使用

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

活动不会重新创建,因为它已经可见,并且onCreate()未被调用且主题未被更改。 我还试图在System.gc();中调用onDestroy(),但无论如何都会增加内存使用量。

以下是我的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>

问题:

有人可以告诉我我做错了什么以及如何防止增加内存使用量?或者也许有更好的方法来改变运行时的应用程序风格?

提前致谢!

1 个答案:

答案 0 :(得分:0)

感谢大家的帮助!

在详细的代码审查过程中,我发现了两件导致内存泄漏的事情:

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

2)我在适配器内部有处理程序(这是我所有的注意力不集中:()在销毁活动之前我不会停止并清除。