重新创建 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.
之前我没有停下来清除
我正在尝试在运行时更改 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.
之前我没有停下来清除