활동

2017-10-18 6 views
-2

두 활동이있는 응용 프로그램이 있다고 가정 유출활동

final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(....); 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
    { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) 
     { 
     } 
    }); 
} 

활동 B는 약간의 비트 맵을로드 그것의 공용 영역을 위해. 종료시 이전 디폴트 캐치되지 않은 예외 핸들러를 복원하지 않습니다. A -> B -> A -> B ...를 수행하면 활동 B가 누출되어 메모리 부족 예외가 발생합니다. 정확히 B 액이 유출 된 이유는 무엇입니까?

답변

0

내 의견으로는 이것이 잘못된 아키텍처입니다. 체인 검색의 경우 각 Activity의 단일 인스턴스 만 가져야합니다. startActivity()을 호출하고 사용하는 IntentIntent.FLAG_ACTIVITY_REORDER_TO_FRONT을 설정하여 다른 Activity 인스턴스간에 전환해야합니다. Intent에 "추가 정보"로 표시 할 데이터를 추가하십시오.

아무리 오래 있더라도 체인을 통해 뒤로 버튼을 사용하려면 각 Activity은 사용자가 언제든지 페이지를 다시 만들 때 필요한 데이터가 들어있는 스택을 관리해야합니다. onCreate()onNewIntent()에서 데이터 ("추가 정보"의 데이터)를 스택에 밀어 넣고 표시해야합니다. 그런 다음 onBackPressed()을 무시하고 startActivity()을 호출하고 IntentIntent.FLAG_ACTIVITY_REORDER_TO_FRONT을 설정하여 이전 Activity으로 돌아갑니다. 또한 사용자가 "돌아 가기"를 원한다는 것을 나타내는 "추가"를 Intent에 추가합니다. onBackPressed()에서 왼쪽에있는 Activity의 데이터 스택에서 맨 위 요소를 버려야합니다. 이렇게하면 사용자가 Activity으로 되돌아 올 때 스택이 올바른지 확인할 수 있습니다.

onNewIntent() 사용자가 방금 Activity에 접속 한 경우 이미 관리 데이터 스택 위에있는 데이터 만 표시하면됩니다.

이 방법으로 각 Activity의 인스턴스를 하나만 가질 수 있으며 사용자는 하루 종일 일련의 활동을 통해 체인을 연결할 수 있으며 BACK 단추는 항상 작동하므로 메모리 부족에 대해 걱정할 필요가 없습니다.

taskAffinity 또는 Intent 플래그를 사용하여이를 수행하려고하면 작동하지 않습니다. 시간을 낭비하지 마십시오. 그것은 또한 나쁜 프로그래밍 스타일입니다.

분명히하는 것이 좋겠습니다. 및 메모리 예외 사용
에 대한 추가 매니페스트

안드로이드> V3

<application 
    .... 
     android:largeHeap="true">