2012-06-27 4 views
2

안드로이드 getApplicationContext 메모리 관리

When to call activity context OR application context?

마크 머피는 getApplicationContext()에서 컨텍스트 그것에 당신의 호출에 의해 생성 된 무언가에 보유하고있는 경우

는 "그것은, 메모리 누수를 만들 수 있습니다 말한다 액티비티로 무언가를 붙잡고 나면 액티비티가 가비지 컬렉션을 받으면 다른 모든 것들도 플러시됩니다. 애플리케이션 개체는 프로세스 수명 동안 유지됩니다. "

응용 프로그램 컨텍스트가 보유하고있는 어떤 것을 생성하는 호출은 무엇입니까?

다양한 상황에 맞는 라이브러리가 필요합니다. 백그라운드에서 실행되고 활동을 확장 할 수 있지만 활동 컨텍스트를 사용하고 업데이트하는 것은 문제가됩니다.

저는 이것이 아마도 응용 프로그램 컨텍스트를 사용하는 것이 바람직한 경우 중 하나라고 생각합니까?

+0

Yes..use 애플리케이션 컨텍스트. – Blundell

답변

1

라이브러리의 객체 수명이 여러 활동에 걸쳐있을 수있는 경우 절대적으로 응용 프로그램 컨텍스트를 사용하십시오. 액티비티 컨텍스트를 사용하면 가비지 컬렉터가 컨텍스트를 버릴 수 없습니다. 활동 컨텍스트가 꽤 많은 데이터를 유지할 수 있으므로 메모리 사용량이 크게 증가 할 수 있습니다.

또한 활동이 닫히면 창 토큰을 포기합니다. 해당 컨텍스트로 대화 상자를 생성하려고 시도하면 BadTokenException이 표시됩니다. 따라서 객체가 활동 라이프 사이클에 직접 연결되어 있지 않은 경우, 객체에 액티비티 컨텍스트를 부여 할 필요가 없다.

편집 : Here is a credible source

+0

이것은 getApplicationContext 사용에 대해 생각한 이유이며, 액티비티 전반에 걸쳐 컨텍스트를 관리하는 것이 아니라 훨씬 쉽게 제어 할 수 있지만 실제로 애플리케이션 컨텍스트의 시나리오에서 메모리가 누출 될 가능성이 얼마나 되는가? – Cullan

+0

유일한 위험은 라이브러리가 어떤 시점에서 무효화되는 컨텍스트에 의존하거나 컨텍스트의 수명 동안 메모리에 머물러있게하는 오류가 라이브러리에있는 경우입니다. – pgsandstrom

+0

명확히 해 줄 수 있습니다 : 라이브러리가 컨텍스트를 참조하도록 만들 수 있습니다. 그럴 경우, 문맥만큼이나 기억 속에 남을 것입니다. 그러나 이것은 도서관 측에서 매우 나쁜 디자인 일 것입니다. – pgsandstrom

0

내 도서관 프로젝트 중 하나에서 동일한 문제가 발생합니다.

라이브러리 프로젝트에서도 활동 컨텍스트를 사용하는 것이 좋습니다. 활동 컨텍스트 만 필요로하는 구성 요소가 많이 있습니다. 예 : 대화 상자. Therfore 내 제안은 프로젝트에서 도서관 프로젝트로 활동 컨텍스트를 전달하는 것입니다.

응용 프로그램 컨텍스트는 라이브러리 프로젝트에서 직렬화 문제를 줄일 수 있지만.

+0

미안하지만 원래 질문에서 라이브러리에 GUI 구성 요소가 없습니다. – Cullan

+0

애플리케이션 컨텍스트보다 사용해야합니다. – vineet