본문 바로가기
개발/android

큰 배경이미지 사용시 OutOfMemoryError의 확실한 해결법

by 매몰 2013. 10. 4.

안드로이드 앱을 만들때 배경이미지를 넣어야 하는 경우 OutOfMemoryError에 직면하는 경우가 많다.. 

 

특히 사이즈가 큰 배경이미지 일수록... 자주 발생한다...

 

즉, OutOfMemoryError는 이름처럼 이미지를 로딩할때 메모리가 부족해서 발생하는것이다...

 

이럴경우 그원인이 되는 이미지 사이즈 자체를 줄이거나 로딩할때 아래와 같이 사이즈를 줄여서 불러오면 일단 해결은 된다.

 

 

 

 

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 2;

 

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.opening, options);

 

 

 

 

하지만 이방법은 치명적 단점이 있다.

 

사이즈를 줄이므로 이미지가 선명하지 못하고 깨져서 보이며, 보통 LinearLayout과 같은 배경으로 많이 쓰이는 view에는 setBackgroundDrawable() 뿐이라서 bitmap을 Drawable로 변환해야 하는 번거로움이 있다...

 

이 두가지 단점을 한번에 해결하는 방법은 과연 없을까?

 

있다. 나도 항상 위와 같은 방법을 쓰다가 영 마음에 안들어서 여러 테스트를 거쳐 알아냈다...

물론 나중에 안거지만 다른분들 포스팅을 보니 이미 그렇게 사용하고 계시는 분들이 있으셨다..

역시 세상에는 코딩신님들이 많은것 같다ㅎㅎ 난 무한 샆질끝에 알아냈다고 좋아했는데ㅎㅎㅎ

 

방법은 무지 간단하다...

 

 

 

 

LinearLayout layout = (LinearLayout)findViewById(R.id.BgLayout);

 

layout.setBackgroundDrawable(new BitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.opening)));

 

 

 

 

이렇게 로딩을 해서 바로 집어넣고 onDestroy()에서 메모리를 풀어주면 된다...

 

 

 

 

@Override

public void onDestroy() {

recycleView(findViewById(R.id.BgLayout));

}

 

private void recycleView(View view) {

if(view != null) {

Drawable bg = view.getBackground();

if(bg != null) {

bg.setCallback(null);

((BitmapDrawable)bg).getBitmap().recycle();

view.setBackgroundDrawable(null);

}

}

    }

 

 

 

 

참고로

 

xml에서 android:background="@drawable/opening" 로 바로 넣거나 layout.setBackgroundResource(R.drawable.opening) 또는  getResources().getDrawable(R.drawable.opening) 로 이미지를 가져오면 원본을 그대로 사용하는것이라서 메모리도 많이 잡아먹고 recycle를 하게 되면 다음번 실행때 에러가 난다...

 

결론은...

 

반드시 위와 같이 new로 복사본을 새로 생성해서 사용해야 메모리도 적게 먹고 recycle도 할수 있어서 OutOfMemoryError를 예방할 수 있다....

 

 

 

 

도움이 되셨다면 구독해주세요~ 유용하고 좋은글 많이 올릴게요~ㅎㅎ

 

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기