앱 만들기/안드로이드

안드로이드 이미지 Out of memory 해결하기

나도 처음이야 2020. 4. 1.

안드로이드에서 고퀄의 이미지등을 로딩하거나 

많은 이미지를 사용할때 이런 에러 메시지를 손쉽게 만날 수 있다. 사실 어디서 부터 손을 되어야 할지 난감하다.

이미지 사이즈도 줄여보고 리사이징 해보고 ... 신경도 많이 써보지만 잘 해결이 안된다.

 

여러분들이 이런 이미지를 사용하시다가 이런 문제들에 봉착하신다면,

바로 구글에서 직접 개발한 Glide 라는 라이브러리 를 사용해보세요.

참고로, 구글에서도 Glide 사용을 권하고 있습니다. 

 

https://developer.android.com/topic/performance/graphics/load-bitmap?hl=ko

 

큰 비트맵을 효율적으로 로드  |  Android 개발자  |  Android Developers

이미지의 모양과 크기는 다양합니다. 많은 경우 이미지는 일반적인 애플리케이션 사용자 인터페이스(UI)에서 요구하는 크기보다 큽니다. 예를 들어, 시스템 Gallery 애플리케이션은 Android 기기의 카메라를 사용하여 촬영한 사진을 표시하는데 일반적으로...

developer.android.com

 

그럼, Glide 적용 하는 방법을 알아보자.

(안드로이드 스튜디오에서 Gradle 을 수정하는 방법)

 

1. Gradle 에 하기 코드 삽입 후 Sync Now 선택하기.

dependencies {

 implementation 'com.github.bumptech.glide:glide:4.11.0' 

annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

}

https://github.com/bumptech/glide

 

bumptech/glide

An image loading and caching library for Android focused on smooth scrolling - bumptech/glide

github.com

이걸로 준비 끝~ 

 

2. 코드에 적용하여 테스트 해보기.

  - 우선  고퀄의 이미지를 준비해서 XML을 만들어 주자.

   필자는 하기처럼 ImageView 만 배치를 했다. 참고로 XML에선 이미지를 로딩하지 말자.

   왜냐면, 이미지에서 고퀄 이미지를 로딩하는 순간 바로 앱이 죽기 때문이다.

  (참고로, 필자는 약 2M 정도의 이미지를 준비함)

 

[ activity_main.xml ]
http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:scaleType="fitXY" />

 

 

 즉, Glide 라이브러리 를 소스에서 활용해 이미지를 로딩해야 된다.

 그럼, 코드에선 어떻게?

 바로 하기처럼 한 줄이면 끝! 

 


public class MainActivity extends AppCompatActivity {

    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView)findViewById(R.id.imageView);
       Glide.with(this).load(R.drawable.bigsize).into(imageView);

    }
}

 

load() 함수의 인자로 로딩할 이미지를 적어준다.

into() 함수의 인자로 이미지가 보여질 ImageView 를 선택해주면 된다.

 

이젠, 고화질 이미지를 로딩 하더라도 앱이 죽지 않고 잘 실행된다.

참고로, 이미지의 크기는 ImageView 에서 설정해 놓은 크기를 기본으로 따라간다.

(물론, Glide 메소드에서도 override() 함수를 이용해서 설정이 가능하며,

원본 이미지의 비율을 따라 가기에 ImageView 설정을 기본으로 하되, 썸네일 혹은 특정 크기에 맞게 조정하고 싶을때 override() 함수를 사용하면 된다)

 

 

 

어렵게 코드를 직접 구성하지 말고,

이미지를 사용할때는 구글에서 추천하는 Glide 라이브러리를 사용하자.

오늘도 필자의 티스토리를 방문해주셔서 감사드립니다.

좋은 하루보내세요.

 

 

반응형

댓글