2012-05-12 7 views
2

내 Activity의 onCreate() 메소드 중 하나에서 UI 스레드에 대한 Handler를 인스턴스화하고 있습니다. (메모리 누출 위험을 피하기 위해 핸들러는 내부 클래스가 아니기 때문에 정상적인 클래스입니다.)onCreate()의 새 처리기

하나의 핸들러는 하나의 스레드에 해당하지만 하나의 스레드는 더 많은 핸들러를 가질 수 있으므로 onCreate()를 호출 할 때마다 새로운 Handler 인스턴스가 인스턴스화됩니다. 따라서 내 활동이 다시 작성되면 (onDestroy 이후에 프로세스가 종료되지 않은 상태에서) onCreate()는 이전 핸들러가 제거되지 않은 동안 다른 Handler를 추가합니다. (안드로이드 소스에서 핸들러는 스레드의 루퍼에 대해서만 묻고 메시지 큐에 대한 참조를 얻습니다.)

최적의 솔루션은 무엇입니까? Handler를 정적 변수로 인스턴스화하고 onCreate()에서 null인지 아닌지 확인할 수 있습니다. nonnull이 아닌 경우 새 인스턴스를 만들 필요가 없습니다. 맞습니까?

(필연적으로, onDestroy()에서 필자는 Handler 인스턴스의 Activity 참조를 NULL로 설정하여 Handler가 Activity 또는 관련 항목을 누설하지 않도록합니다. 그리고 처리기의 처리 메서드가 null인지 확인하고 하지만 필요한 경우 메시지를 삭제합니다.하지만 내 질문은 이전 단락에 설명 된 이유 때문에 처리기가 여전히 스레드에 보관되어 있으므로 onCreate 호출이 많을수록 UI 스레드에 핸들러 인스턴스가 더 많이 추가된다는 것입니다. this? 중요하지 않은 경우 안드로이드가 현재 스레드와 관련된 Handler가 GC-d 여야한다는 것을 어떻게 감지합니까?)

답변

4

처리기는 Thread, Looper 또는 다른 어떤 것에 의해 참조되지 않습니다. 핸들러는 Looper의 메시지 대기열에 물건을 넣는 편리한 방법 일뿐입니다.

onCreate()에서 Handler를 인스턴스화하고이를 액티비티의 멤버 (인스턴스) 변수에 할당하면, 액티비티가 가비지 수집 될 때 Handler는 참조하는 것이 없기 때문에 가비지 수집됩니다.

따라서 onCreate()에서 처리기 객체를 만들면 메모리 누수가 발생하지 않습니다.