본문 바로가기

IT

ViewPager에서 Bitmap또는 Drawable의 사용이 많은 경우 memory leaks crash를 처리하는 방법

반응형

 이번에 이미지를 동적으로 많이 사용하는 프로그램을 제작하면서 ViewPager를 이용하여 순차적으로 보여주는 방법으로 처리를 하는 와중에 1024*768 정도의 이미지 12장을 ViewPager에 올리면서 메모리 오버플로가 발생하여 이리저리 해결방법을 찾아보았다.


 효과적인 처리방법은 아니지만 일단 땜빵후 좀더 능동적으로 Bitmap/Drawable을 메모리에서 클리어하는 방법을 적용해 봐야 겠다.


 일단 처리방법에 대한 간단한 설명 : ViewPager는 화면에 보이는 View와 화면에 보이지 않는 View에 대한 정보를 메모리에 올리는데, 화면에 보이지 않는 View를 미리 읽어오는 것을 몇개까지 할 수 있게 하는지에 대해 설정을 할 수 있다. 코드는 간단한다.


// ViewPager를 초기화하는 부분에 해당 코드를 넣는다.
mViewPager.setOffscreenPageLimit(2);


 이 코드는 화면에 보이지 않는 ViewPager의 객체를 최대 2개까지만 사용한다는 것이다. 숫자는 필요에 따라 HeapMemory의 상태를 잘 보면서 프로그램마다 알맞은 숫자로 결정해야 한다. (0)이면 하나도 읽어 놓지 않는다.


 위 코드를 추가하고, 이후 ViewPager의 Adapter에서 처리해야 하는 부분이 하나 있다.

 일반적으로 ViewPager의 Adapter로는 PagerAdapter라는 클래스를 확장하여 구현하게 되는데, 메소드중


public Object instantiateItem(ViewGroup container, int position)


 위의 메소드를 오버라이드하여 실제화면에 뿌려지는 View를 설계한다. 요 메소드 이외에 다음 메소드를 구현한다.


public void destroyItem(ViewGroup container, int position, Object object)


 요 메소드의 역할은 위 setOffscreenPageLimit() 메소드에서 정의한 갯수와 관련이 있다. 만약 전체 10페이지의 View가 ViewPager에 나타난다고 했을 때 맨처음 포지션 0에서부터 보여지게 되고 OffscreenPageLimit을 2로 설정하면 0, 1, 2 포지션에 해당하는 View를 instantiateItem()메소드를 통하여 메모리에 올라오게 된다. 이때 페이지를 이동하면 메모리에 올라가는 페이지는 현제 보여지는 View, 보이지 않는 View를 포함하여 3개의 View가 메모리에 올라오고 나머지는 메모리에서 클리어가 되야하는 경우가 발생하는데 그런경우 그 처리를 하는 메소드가 destroyItem() 메소드이다. 구현은 다음과 같다.


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
	DLog.d("POSITION", "Destroy Position::" + position);
	/** 간단히 한줄로 처리가 된다. */
	container.removeView((View)object);
	// super.destroyItem(container, position, object);
}


 이제 프로그램을 기기에 올려서 eclipse의 DDMS perspective를 통하여 HeapMemory의 상태를 주시하면서, Logcat의 로그를 살펴보면 메모리에서 클리어되는 것을 감상할 수 있다.


 이렇게 클리어하는데도 메모리부족이 계속된다면 더 능동적으로 Bitmap/Drawable객체를 처리하는 방법을 생각해보아야 한다.


 명심: 이건 땜빵이다;;;;



 하나더 추가 :

AndroidManifest.xml에서 Heap사이즈 메모리를 조정할 수 있는 옵션을 제공하는데, 이도 함께 사용하면 좋다.

android:largeHeap="true" 를 <application> 태그에 넣으주면 큰 힙메모리를 사용할 수 있다.



 참조 웹페이지 : http://stackoverflow.com/questions/13586963/android-viewpager-with-images-memory-leak-app-crashes

반응형