런타임에 활동의 스타일을 변경하려고합니다.활동을 재현하는 중 메모리 부족 오류가 발생했습니다.
하지만 활동을 재현하는 동안 사용 된 메모리가 증가하는 문제에 직면했습니다.
스타일 변화를 위해 나는 몇 가지 테마를 정의하고 활동 안에 그들을 위해 int array
를 초기화 :
private int themes[] = new int[]{R.style.AppThemeOrange, R.style.AppThemeTeal,...};
을 내가 환경 설정을 다시 시작된 활동에 테마 ID를 저장 한 다음 테마를 설정하십시오. 일부 값 0.1-0.2mb 증가마다 다시 활동 할당 된 메모리 힙 후
public void changeTheme() {
PreferencesManager.getInstance().setAppTheme(themes[(getCurrentThemePos() + 1) % themes.length]);
recreate();
}
: 여기에 테마를 변경하는 나의 방법은
setTheme(PreferencesManager.getInstance().getAppTheme());
입니다 : 다음 onCreate
방법 안에 내가 환경 설정에서 테마를 설정합니다. 따라서 앱 테마를 여러 번 변경하면 Out Of Memory
오류가 발생합니다. 여기 내 메모리 모니터입니다 :
. 나는 의도를 사용하여 작업을 다시 실행하여 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();
}
이 또한 내가
AndroidManifest
에 사용 가능한 모든 값을
launchMode
을 시도했다. 효과가 없습니다. "this"의 모든 항목을 "getApplicationContext()"로 변경했습니다. xml 파일에 루트 레이아웃 만 남겼습니다. 여기에
similar problem입니다. 그러나 거기에는 두 가지 활동이 있습니다. 내 경우에는 내가 이미 볼 수 있기 때문에
Intent i = new Intent(getApplicationContext(), UsersActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
활동,를 재생성을하지 않습니다 사용하고 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>
질문 :
누군가가 내가 잘못하고 내가 어떻게 메모리 사용을 증가 방지 할 수있는 저를 게재 할 수 있습니까? 아니면 런타임에 앱의 스타일을 변경하는 더 좋은 방법이 있을까요?
미리 감사드립니다.
을이 활동을 누출 슈퍼 쉽게 안드로이드에서. 당신이 어떤 AsyncTasks 또는 처리기를 사용하고 있습니까 ? 컨텍스트를 보유하는 싱글 톤이 있습니까? – CaseyB
테마 전환 코드를 호출하지 않고 장치를 단순히 돌리면 동일한 무한 방식으로 메모리 풋 프린트가 커지나요? 또한 동일한 활동을 다시 시작하기 때문에 당신은 단지'android : launchMode = "singleTop"'로 접근 할 수 있고'Intent.FLAG_ACTIVITY_REORDER_TO_FRONT'는 필요 없습니다. 도움이 되나요? – theFunkyEngineer
빠른 답장을 보내 주셔서 감사합니다! @CaseyB 코드에서 AsyncTasks와 Handlers를 사용합니다. ,하지만 테스트를 위해 나는 comented 'setTheme'과'setContentView' 메소드 만 남겨 두었습니다. @FunkyEngineer 회전 장치로 인해 같은 상황이 발생합니다. 귀하의 답변 덕분에 나는 테스트를 위해 완전히 새로운 프로젝트를 만들려고 노력했습니다. 내가 사용하는 기본 XML 레이아웃을 만들 때 활동 메모리를 재현 한 후 증가하지만 몇 시간이 지나면 시작 상태 (약 11MB)로 돌아갑니다. 이전 xml 레이아웃을 새 프로젝트에 추가 할 때 문제가 발생합니다. 그래서 나쁜 레이아웃을 관리한다고 생각합니다. 나는 더 많은 정보로 나의 질문을 업데이트 할 것이다! – MatWay