2016-09-29 1 views
0

클래스에 정적 Context 개체가 포함되어 있으면 Android Studio에서 경고를 표시합니다. 그것은 이것이 메모리 누출을 야기한다고 말한다. 그러나, 나는 이것도 안드로이드 라이브러리에서 수행 된 것으로 나타났습니다. 예를 들어 LocalBroacastManager 클래스에는 정적 인스턴스가 있고 context 개체가 포함되어 있습니다.정적 컨텍스트 경고

메모리 누수로 얼마나 나쁜가요?

나는 백그라운드에서 실행되는 싱글 톤 지오 펜싱 클래스를 가지고 있으며 사용자가 지오 펜스에 있는지 여부를 나타내는 boolean ~ sharedPreferences을 저장합니다. 환경 설정을 저장하려면 context 개체가 필요하지만 메서드가 재정의 된 메서드이기 때문에 컨텍스트 개체를 전달할 방법이 없습니다.

context 인스턴스 변수없이 어떻게 수행 할 수 있습니까?

답변

2

당신이 가질 수있는 최악의 경우. Activity가 있고이를 정적 컨텍스트로 저장한다고 가정 해 보겠습니다. 활동이 끝났을 때 그것을 무효로하지 않으면, 이제 전체 활동이 유출되었습니다. 이는 전체 뷰 계층을 포함하여 활동이 보유하는 모든 변수가 유출되었음을 의미합니다. 기본적으로 컨텍스트의 모든 내용이 해제되는 것을 방지합니다.

할 일은 컨텍스트를 저장하는 것이 아니라 필요한 컨텍스트에 매개 변수로 전달하는 것입니다. 컨텍스트를 저장해야하는 경우 고정시키지 마십시오. 비 정적 변수는 액티비티가 끝난 후에도 프레임 워크에서 객체에 대한 참조를 계속 보유하지 않는 한 그것을 유출하지 않습니다.

절대적으로 정적 컨텍스트를 사용해야하는 경우 응용 프로그램 컨텍스트로 지정하십시오. 이 앱은 앱의 길이에 따라 유효하므로 누출 될 수 없습니다.

1

특히 Android에서는 통계를 거의 사용하지 않아야합니다. 통계학을 사용하는 방법과 이유가 있지만, 90 %의 경우에는 오용됩니다.

컨텍스트를 정적 변수로 유지하는 것은 큰 일이 아닙니다. 시나리오 다음과 같은 상상 :

  1. 당신은
  2. 는 당신이 어딘가에 정적 컨텍스트로 활동 B의 참조를 유지하는 동안 활동 B에서 활동 B로 활동 A에서 이동합니다.
  3. 액티비티 A로 돌아갑니다. 액티비티 B는 파기해야하지만, 정적 참조를 유지하기 때문에 유지됩니다.
  4. 이제 B에서 A, et voila로 다시 이동합니다. 두 개의 B 인스턴스가 있습니다. 하나는 보는 것이고 다른 하나는 정적 컨텍스트로 유지됩니다.

동일한 활동이 두 개인 경우가 절대 없습니다. 그것은 많은 문제를 일으킬 수 있습니다.

지금은 많은 개발자 (심지어 도서관을 만드는 사람들조차도)가 실수를하고 안티 패턴을 사용하므로 다른 사람의 코드에서 본 연습/패턴에 맹목적으로 의존해서는 안된다는 것을 알고 있습니다. 지옥, 나는 Google devs가 쓴 글에서 많은 쓰레기 코드를 보았습니다.

Dagger와 같은 라이브러리를 사용하지 않으려는 경우 싱글 톤 (싱글 톤 패턴 (대문자 S는 아님))이 필요하지만 일부 클래스의 단일 인스턴스가 필요한 경우 Application 클래스에서 해당 클래스를 인스턴스화 할 수 있습니다 , 원하는 곳에서 참조하십시오.

+0

실제로 대부분의 사람들은 응용 개체를 요즘 시대의 단일 개체 소지자로 생각합니다.정적 사용보다 이점이 없습니다. 싱글 톤을 생성하기 위해 정적을 사용하는 것은 문제가 없지만 컨텍스트를 유지하는 데 사용해서는 안됩니다. –

+0

objets를 statics로 저장하고 그런 식으로 액세스하면 공유 상태가되는 것을 의미하므로 피할 수있는 부분이 있습니다. 또한 싱글 톤 패턴으로 만들어진 오래된 싱글 톤은 상속되거나 확장 될 수 없습니다. 클래스의 인스턴스를 하나만 원한다면 하나의 인스턴스 만 만들고 IoC를 사용하면 필요할 때마다 사용할 수 있습니다. 왜 그것이 시대 착오적 인 지 잘 모르겠다. 애플리케이션 클래스는 클래스/의존성 트리에서 singletom과 a 최상위 클래스이다. 보통 Java 애플리케이션에서 main() 메소드를 유지하는 클래스와 비슷하지만, ssingleton을 인스턴스화하는 루트 장소가 될 수있는 좋은 후보자이다. . – SadClown

관련 문제