我试图在运行时改变活动的风格。
但是我在重新创建活动时遇到了增加使用内存的问题。
为了改变风格,我定义了一些主题,并在活动中为它们初始化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
错误。这是我的记忆监控器:
仅在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>
问题:
有人可以告诉我我做错了什么以及如何防止增加内存使用量?或者也许有更好的方法来改变运行时的应用程序风格?
提前致谢!
答案 0 :(得分:0)
感谢大家的帮助!
在详细的代码审查过程中,我发现了两件导致内存泄漏的事情:
1)在我的xml文件中,我使用了第三方视图(AVLoadingIndicatorView),它不会删除onDetachedFromWindow()
方法中的动画师。此外,我发现另外一些第三方进度条在分离后不会清除动画。
2)我在适配器内部有处理程序(这是我所有的注意力不集中:()在销毁活动之前我不会停止并清除。