2011-04-18 7 views
4

저는 Worker Service과 많은 액티비티를 가지고 있습니다. Activity은 모두 Handler입니다.을 startService 방법으로 Service으로 전송하여 활동을 시작할 수 있습니다. 이러한 작업은 대기열에 들어가서 순차적으로 처리됩니다.이 활동 - 서비스 메시징 패턴으로 인해 메모리 누수가 발생합니까?

완료된 작업의 결과를보고하기 위해 작업을 설명하는 Intent이있는 Messenger 개체로 포장 된 적절한 작업의 Handler을 제공합니다. Service은 이것을 통해 Activity 호출에 대한 메시지를 다시 보냅니다. 이것은 잘 작동합니다.

그러나 제공된 Activites이 완료된 후에도 Handlers은 메모리에 남아있는 것으로 보이며 완료 메시지를 계속 처리합니다.

  • 어떻게 될 수 있습니까? 그들이 처리하는 Activity으로 처리기를 파괴해서는 안됩니까?
  • 이로 인해 메모리 누수가 발생합니까?
+0

일부 코드를 입력해야합니다. 활동에서 의도 객체를 어떻게 선언합니까? 어떻게 그들을 당신의 서비스에 전달합니까? Service가 다른 Handler에 대한 참조를 유지하는 방법은 무엇입니까? – HitOdessit

답변

2

서비스에는 여전히 활동 처리기에 대한 참조가있는 Itnents에 대한 참조가 있으므로 처리기가 가비지 수집에 사용할 수 없게됩니다.

this video from Google IO을 보았습니까? RESTful 웹 서비스를 사용하는 앱을 작성하는 것이므로 직접 관련이 없지만 장기 실행 이벤트에 응답하는 책임을 위임하는 방법은 부분적으로 문제에 매핑됩니다.

너무 많이 변경하지 않으려면 onClose 또는 onDestroy에서 서비스 (및 의도를 통해)가 담당하는 장기 실행 작업이 ' t는 더 이상 필요 없다. 핸들러에 대한 참조를 제거하므로 GC가 제거 할 수 있습니다.

실행중인 작업의 관리 (비디오 에서처럼)를 중앙 집중화하거나 ServiceHelper 클래스의 수명주기에 응답합니다. 해당 클래스는 이벤트가 발생하면 이벤트를 게시 할 수 있으며 해당 이벤트는 이벤트가 수신 할 수 있습니다.

이렇게하면 코드를 한 곳에서 찾을 수 있으므로 서비스 처리 방법을 변경할 때 모든 작업을 변경할 필요가 없습니다.