2012-01-11 3 views
4

Storing a Bitmap resource in a static variable을 추적하면 android.graphics.Bitmap의 정적 참조를 View에 저장하면 해당 인스턴스를 초기화 한 해당 View에 대한 참조가 누수 될 수 있습니다. Android에서 이것을 해결하는 관용적 인 방법은 무엇입니까? 이 뷰의 인스턴스가 인스턴스화 될 때마다 BitmapFactory.decodeResource(resource, id)에 전화하기를 원하지 않습니다.이 작업은 모든 단일 활동에서 (여러 번) 수행 될 것이기 때문입니다. 이 작은 Bitmap이 항상 메모리에 남아 있기를 원합니다. 그럼, 다음을 수행하는 올바른 방법은 무엇입니까 :메모리에 비트 맵을 유지하는 방법

public class MyView extends View { 
    private static Bitmap star; 
    public MyView(Context context) { 
     synchronized(this) { 
      if (star == null) { 
       star = BitmapFactory.decodeResource(getResources(), R.drawable.star); 
      } 
     } 
    } 
    // ... 
} 

답변

3

보기에서 활동의 ()에서 호출하는 정적 정리 메소드를 생성하십시오. 이 호출에서 비트 맵 recycle()을 호출하고 참조를 지우십시오. 마찬가지로 생성자에서 비트 맵을 만드는 대신 활동의 onResume()에서 호출하는 초기화 호출을 사용합니다.

뷰가 여러 활동에서 사용되어 오버랩 될 염려가있는 경우 init 및 정리 호출에서 참조 횟수를 유지하도록 설정하여 카운트가 0이되었을 때만 비트 맵이 파괴되도록 할 수 있습니다 비트 맵이 충분히 작 으면 onCreate()/onDestroy()으로 간주 할 수 있습니다.

뷰 클래스의 비트 맵 참조에서 null을 확인한 후 사용하십시오.

+0

응용 프로그램 클래스에 비트 맵을 넣으면 참조를 지워야합니까? – Kostadin

0

나는 정적 인 것으로 나타났습니다. 생성자에서 정적 필드를 설정해야합니다. 이는 혼란 스럽기 때문입니다. 필드를 설정하는 정적 메서드를 호출하는 것이 좋습니다.

정적 메서드를 동기화 할 수 있습니다.


생성자는 항상 스레드로부터 안전하므로 synchronized 또는 null을 사용할 필요가 없습니다. 당신은 필드를 설정 (그리고 그것을 final을)보기가하고 당신은 전체 응용 프로그램을 통해 그 일을보기

또는 경우에 비트 맵을 통과 곳

+1

OP의 코드에서'star'가'static'이라고 놓친 것 같습니다. –

0

이유는 바로 활동에 이미지를로드 할 수 없습니다 응용 프로그램 컨텍스트를 사용하여 이미지를로드하십시오.