0

런타임에 활동의 스타일을 변경하려고합니다.활동을 재현하는 중 메모리 부족 오류가 발생했습니다.

하지만 활동을 재현하는 동안 사용 된 메모리가 증가하는 문제에 직면했습니다.

스타일 변화를 위해 나는 몇 가지 테마를 정의하고 활동 안에 그들을 위해 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 오류가 발생합니다. 여기 내 메모리 모니터입니다 :

내가 25메가바이트 10에서 메모리 힙을 증가 1 분 테마 변경 후

memory monitor screen

. 나는 의도를 사용하여 작업을 다시 실행하여 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> 

질문 :

누군가가 내가 잘못하고 내가 어떻게 메모리 사용을 증가 방지 할 수있는 저를 게재 할 수 있습니까? 아니면 런타임에 앱의 스타일을 변경하는 더 좋은 방법이 있을까요?

미리 감사드립니다.

+1

을이 활동을 누출 슈퍼 쉽게 안드로이드에서. 당신이 어떤 AsyncTasks 또는 처리기를 사용하고 있습니까 ? 컨텍스트를 보유하는 싱글 톤이 있습니까? – CaseyB

+1

테마 전환 코드를 호출하지 않고 장치를 단순히 돌리면 동일한 무한 방식으로 메모리 풋 프린트가 커지나요? 또한 동일한 활동을 다시 시작하기 때문에 당신은 단지'android : launchMode = "singleTop"'로 접근 할 수 있고'Intent.FLAG_ACTIVITY_REORDER_TO_FRONT'는 필요 없습니다. 도움이 되나요? – theFunkyEngineer

+0

빠른 답장을 보내 주셔서 감사합니다! @CaseyB 코드에서 AsyncTasks와 Handlers를 사용합니다. ,하지만 테스트를 위해 나는 comented 'setTheme'과'setContentView' 메소드 만 남겨 두었습니다. @FunkyEngineer 회전 장치로 인해 같은 상황이 발생합니다. 귀하의 답변 덕분에 나는 테스트를 위해 완전히 새로운 프로젝트를 만들려고 노력했습니다. 내가 사용하는 기본 XML 레이아웃을 만들 때 활동 메모리를 재현 한 후 증가하지만 몇 시간이 지나면 시작 상태 (약 11MB)로 돌아갑니다. 이전 xml 레이아웃을 새 프로젝트에 추가 할 때 문제가 발생합니다. 그래서 나쁜 레이아웃을 관리한다고 생각합니다. 나는 더 많은 정보로 나의 질문을 업데이트 할 것이다! – MatWay

답변

0

도움 주셔서 감사합니다. 내 xml 파일 내가 onDetachedFromWindow() 방법에서 애니메이터를 제거하지 않고 제 3 자보기 (AVLoadingIndicatorView) 느릅 나무를 사용에서

1) :

은 상세 코드 리뷰하는 동안 난 메모리 누수의 원인이 2 가지를 발견했다. 또한 일부 다른 타사 진행률 막대가 분리 후 애니메이션을 지우지 않는 것을 발견했습니다.

2) 활동을 파괴하기 전에 어댑터 내부 핸들러 (즉 내 부주의 :(전부) 난 멈추지 않는 분명했다.

관련 문제