[Android] Glide 로 이미지 Load하기
by Yena Choi
Study Note
Glide
Glide, 글라이드는 안드로이드에서 이미지를 빠르고 효율적으로 불러올 수 있게 도와주는 라이브러리이다. 사용 방법도 간단하고 확장성도 넓어서 이미 메이저하게 사용되고 있는 라이브러리이다. 이미지, Gif, 비디오 스틸의 로딩과 디코딩, 캐싱 등의 다양한 API를 사용할 수 있다. 기본적으로는 커스텀하게 만들어진 HttpUrlConnection 기반이지만
, Volley
나 OkHttp
라이브러리를 사용할 수 있는 플러그인도 지원한다.
Glide는 어떠한 종류의 이미지이더라도 빠르고 부드럽게 스크롤 하는 것을 목적으로 한다. 공식 페이지의 설명을 보면 이 부분을 참 많이 강조하는 것 같다. 실제로도 Glide를 사용하면서도 그러한 인상을 받고 있다.
Gilde 사용 방법
사전 준비
Gradle에서 dependency를 추가해준다.
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
또한 외부 통신을 통해 이미지를 가져와야 한다면 인터넷 권한을 매니페스트 파일에 추가해준다.
<uses-permission android:name="android.permission.INTERNET" />
뷰에 이미지 로드하기
특별한 옵션 없이 단순히 뷰에 이미지를 넣는 것이라면 with()
, load()
, into()
로도 표현할 수 있다.
/* Activity에서 사용할 경우 */
Glide.with(this)
.load(R.drawable.img_file_name)
.into(imageView)
/* ViewHolder에서 사용할 경우 */
Glide.with(itemView)
.load(R.drawable.img_file_name)
.into(itemView.imageView)
drawable에 img_file_name.jpeg
파일을 넣고 Glide로 불러오는 방식을 사용해보았다. RecyclerView에서 사용하려면 ViewHolder에서 바인드할 때 같은 방식으로 불러주면 된다.
각 함수의 기능을 간단히 살펴보자.
with()
: View, Fragment 혹은 Activity로부터 Context를 가져온다.load()
: 이미지를 로드한다. 다양한 방법으로 이미지를 불러올 수 있다. (Bitmap, Drawable, String, Uri, File, ResourId(Int), ByteArray)into()
: 이미지를 보여줄 View를 지정한다.
위의 함수들은 Glide의 뼈대가 되는 기능이다. Glide는 단순히 로딩만 도와주는 것이 아니라, 에러 상황이 발생한다던가 후가공이 필요할 때에 손쉽게 처리할 수 있도록 함수를 제공한다.
예시로, 이미지 로딩 전/후 처리에 대한 함수를 보자.
Glide.with(this)
.load(R.drawable.img_file_name)
.placeholder(R.drawable.img_file_place_holder)
.error(R.drawable.img_file_error)
.fallback(R.drawable.img_file_no_img)
.into(imageView)
placeholder()
: Glide 로 이미지 로딩을 시작하기 전에 보여줄 이미지를 설정한다.error()
: 리소스를 불러오다가 에러가 발생했을 때 보여줄 이미지를 설정한다.fallback()
: load할 url이null
인 경우 등 비어있을 때 보여줄 이미지를 설정한다.
Glide의 모토가 빠르고 부드러운 스크롤을 제공하는 것이라고 한 것을 기억한다면, 위 함수가 이해가 될 것이다. 하얀 화면을 보여주는 것보다 placeholder나 no image 파일을 보여준다면 사용자 입장에서 더 좋은 UX를 경험할 수 있을 것이다.
또 다른 장점으로는, Glide에서는 기본적으로 이미지의 URL을 이용해 메모리와 디스크에 캐싱을 한다.
Glide.with(this)
.load(R.drawable.img_file_name)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
skipMemoryCache()
: 메모리에 캐싱하지 않으려면 true로 준다.diskCacheStrategy()
: 디스크에 캐싱하지 않으려면 DiskCacheStrategy.NONE로 준다. 다음과 같은 옵션이 있다. (ALL, AUTOMATIC, DATA, NONE, RESOURCE)
이로써 메모리 사용과 서버 통신을 효율적으로 할 수 있게 해준다.
GIF 이미지 로딩하기
위의 방법대로 움직이는 gif 이미지를 불러오면 재생이 되지 않는다. 스오플에 도움을 구하러 갔는데, 의외로 간단하게 asGif()
를 호출하면 해결되는 문제였다.
Glide.with(this)
.load(R.drawable.gif_file)
.asGif()
.into(imageView)
이렇게 했을 때에 gif가 무한 반복 재생 되는 문제가 있었다. 한 번만 재생한 후 멈추길 바라는 이미지여서, 다음과 같이 listener
를 추가해 루프를 한 번만 돌도록 설정할 수 있었다.
Glide.with(this)
.load(R.drawable.gif_file)
.asGif()
.listener(new RequestListener<GifDrawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (resource != null) {
resource.setLoopCount(1);
}
return false;
}
})
.into(imageView)
이 외에도 공식 문서에 수많은 기능이 제공되어 있다. 이미지 후처리에 관한 웬만한 기능은 모두 제공하는 것 같다. 게다가 이미 피카소나 여타 다른 이미지 로딩 라이브러리에 비해 속도, 성능 면에서도 검증이 되었다. 함수명도 알아보기 직관적이고 사용도 간편해서 상당히 메리트 있는 라이브러리라고 생각된다.