2011-04-24 5 views
13

뷰 계층 구조는 TabActivity ->ActivityGroups ->Activities입니다.InputMethodManager는 탭 호스트 - 메모리 누수 - OOM 오류에 대한 참조를 보유합니다.

나는 따라서 TabWidget가 유출되고, TabWidgetInputMethodManager에서 참조 TabHost에 의해 참조되는 것을 발견 MAT 사용. On 응용 프로그램 OutOfMemory 오류의 후속 시작 오류가 발생합니다.

은 마찬가지로 내 모든 활동은 InputMethodManager에 의해 참조됩니다. 이 (키를 반격) 제대로 응용 프로그램을 마무리에

(내 모든 액티비티 그룹이, 활동, tabactivity, tabhost 및 tabwidget가! 유출하는 응용 프로그램을 닫은 후), 다음은 로그 캣에 표시됩니다

이 WARN/InputManagerService (99) : 비 집중 [email protected] 클라이언트에서 입력을 시작 (UID = 10052 PID = 1463) InputMethodManager에서 기준을 제거하는 방법

.. .? 내가 시도

것 :

A.이 방법 내 TabActivity
1 myTabWidget.removeAllViews()
2 myTabWidger.invalidate()

행운의 onDestroy를 호출!


답변

1

것 : 내 TabActivity 1.myTabWidget.removeAllViews() 2.myTabWidger.invalidate이 방법들의 OnDestroy 호출 A.() 물론

, 그것은 작동하지 않습니다. 활동은 MVC/MVP/MVVM이나 Android SDK 클래스 계층에서보기가 아닙니다. android.app.Activity does not extend android.view.View

내 동료는 메모리 누수와 비슷한 문제가있었습니다. TabActivity에서 tabHctivity를 정적 방식으로 선언했습니다. (다른 활동에서 액세스하려고했으나 패턴 옵저버에 익숙 함). 나는 당신이 비슷한 것을 만들었다 고 생각합니다. 마지막에

그리고, 내 질문 : 활동에 InputMethodManager을하지 : 왜 (이 최종 클래스의 내가 이해가 안 돼요하지만) InputMethodManager에서 활동을 참조합니까? 당신이 InputMethodManager 글로벌 초점 포인트를 원하는 경우에, 나는 당신이 응용 프로그램 클래스에의 참조를 넣어 조언을 할 수 있습니다. 우리는 우리가 (예를 들어, 된 SharedPreferences) 일반적인 물건을 선언이 외관에서 (예를 들어, HostApplication) 응용 프로그램 클래스를 확장합니다. 그리고 우리가 작성하는 활동에서 :

HostApplication application = (HostApplication) getApplication(); 

그런 다음 우리는 그것으로부터 유용한 공통점을 얻습니다.

+0

(참고로, 내가 한 지점에서 두 TabActivities을 볼 수 있었지만 문제가 InputMethodManager 아니었다, 그것은 코드의 정적 참조했다). "패턴 관찰자"에 대해 더 자세히 설명하는 링크를 제공해 주시겠습니까? – Mani

+1

http://en.wikipedia.org/wiki/Observer_pattern 하나의 모델을 Observable (제목)으로, Activities를 Observers (인터페이스 "Observer"를 구현)로 만들었습니다. 처음에는 활동이 모델에 등록되었습니다 (우리는 싱글 톤을 사용하지만 서비스 또는 응용 프로그램을 사용할 수 있습니다). 흥미롭고 관찰 가능한 해고 이벤트가 있었으면 모든 고객에게 알립니다. 파괴되기 전에, Activity는 Observable에서 자체 등록을 취소하여 메모리 누수를 피했습니다. 안드로이드에서 메모리 누수의 원인은 대부분 간단합니다 : Context/View/Dialog는 어딘가에서 정적으로 선언되었습니다. – QuickNick

3

나는이 문제를 만난 나는 그것을 피할 수있는 방법을 시도했다.내 활동이 끝나면 입력 메소드 관리자 서비스와의 연결을 끊으려고합니다. 확인해보십시오 :

class MyActivity extend Activity { 
    @Override 
    public void finish() { 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.windowDismissed(mContentView.getWindowToken()); 
     super.finish(); 
    } 
} 

이 메모리 누출 문제를 해결할 수 있는지 확실하지 않습니다. 당장은 괜찮습니다. 시도해 볼 수 있습니다.

+1

mContentView는 tablayout의 루트보기에 대한 참조입니까? – Mani

+0

InputMethodManager.windowDismissed는 Android API의 숨겨진 메소드입니다. 그래서, 괜찮습니다. 이를 작동 시키려면 reflection을 사용해야합니다 :'((Class.forName ("android.view.inputmethod.InputMethodManager")) getMethod ("windowDismissed", IBinder.class)); ' – iamreptar

1

메모리 누수가 확실합니까? 비슷한 상황이 있는데 MAT에서 메모리 누수가있는 것처럼 보이지만 InputMethodManager 때문에 TabActivity의 두 인스턴스를 표시 할 수 없습니다. 물론, InputMethodManager는 TabActivity를 가비지 수집으로부터 보호합니다. 그러나 이것이 실제 메모리 누출이라면 두 개의 TabActivites를 볼 수 있습니까? 그 다음에 세 개, 네 개를 볼 수 있습니까?

가 어쨌든 InputMethodManager를 참조하지 않는

+0

예, 맞습니다. InputMethoManage는 아무 것도하지 않습니다. 선택한 탭을 전환하는 데 사용한 정적 참조에 문제가 있습니다. 위의 답변에서 "QuickNick"은 고정 참조를 제거하는 방법에 대해 언급했습니다. obeserver 패턴을 사용합니다. – Mani