2012-02-06 4 views
0

파일 다운로드 및 지속을 담당하는 싱글 톤 클래스 (Downloader)가 있다고 가정 해보십시오. 클라이언트가 다운로드를 요청하면 콜백도 제공해야합니다. 내 질문에 그 콜백 개체의 저장소에 관한.Activity-Lifecycle에 대한 오래 지속되는 참조

콜백 인터페이스를 구현 한 Activity를 여러 개의 대규모 다운로드를 요청한 경우 Downloader 클래스는 Activity에 대한 참조를 무기한 보관합니다. 다운로드가 끝나기 전에 요청한 활동이 수명주기를 거치고 파괴됩니다.

이 경우 Downloader는 리사이클러가 활동을 가비지 수집하지 못하게합니다. 요청한 다운로드가 계속됩니다. 그러나 내가하고 싶은 것은 어떻게 든 제공되는 콜백을 수집해야한다는 것을 감지하고 효과적으로 누수하고 있습니다.

이와 비슷한 디자인 패턴이 있습니까? Reference 하위 클래스 중 하나가 유용하다고 생각했습니다.

감사합니다.

답변

1

다른 방법으로 작업을 수행하고 연결을 끊어 놓고 활동 참조를 유지하는 매우 불필요한 관행을 피할 수 있습니다.

모든 싱글 톤에 대한 정적 참조를 유지하고 유형별로 해결하는 매우 간단한 ServiceLocator 클래스를 만들었지 만 더 간단하게 처리 할 수 ​​있습니다. 다운로더에 대한 정적 참조를 보유하는 클래스가 필요하며 해당 참조를 사용자의 활동에 노출하십시오. 어떤 활동으로 다시 전화해야하는 경우 Android 프레임 워크에서 게시/구독 모델 (예 : setOnClickListener(OnClickListener listener))을 사용합니다.

Downloader에는이 인터페이스의 단일 인스턴스 인 DownloadUpdateListener라는 내부 인터페이스와이를 설정하고 활동에서 참조를 제거하는 등록 및 등록 취소 메소드가있을 수 있습니다. Activity는 DownloadUpdateListener 인스턴스를 로컬에서 생성하여 모든 Activity 필드와 뷰에 대한 액세스 권한을 갖습니다. Downloader에서 리스너가 메소드를 호출하기 전에 null이 아닌지 확인하십시오. 수신자를 onResume에 등록하고 onPause에서 등록을 취소하는 것을 잊지 마십시오.

+0

구독/수신 거부는 작동하는 동안 조금 제한적입니다. 또한 필자는 동급 최고의 활동 라이프 사이클을 알지 못하는 비 활동 객체 (예 : 어댑터)에서 다운로더를 사용합니다. 이 중 하나는 내 어댑터에 대한 onPause/onResume 메서드를 구현하고 Activity에서 호출하거나 다른 해킹을 사용하도록합니다. – zienkikk

+0

그런 다음 내 ServiceLocator가 필요합니다. 내 ServiceLocator 모든 내 singletons 정적 참조를 보유하고 있기 때문에 내 애플 리케이션에서 어디에서나에서 아무것도 해결할 수 있습니다. – Rich

+0

ServiceLocator가이 문제를 어떻게 푸는 지 이해할 수 없을 것 같습니다. 다운로더는 여전히 콜백에 대한 참조를 보유해야합니다. – zienkikk