Glide

Glide, 글라이드는 안드로이드에서 이미지를 빠르고 효율적으로 불러올 수 있게 도와주는 라이브러리이다. 사용 방법도 간단하고 확장성도 넓어서 이미 메이저하게 사용되고 있는 라이브러리이다. 이미지, Gif, 비디오 스틸의 로딩과 디코딩, 캐싱 등의 다양한 API를 사용할 수 있다. 기본적으로는 커스텀하게 만들어진 HttpUrlConnection 기반이지만, VolleyOkHttp 라이브러리를 사용할 수 있는 플러그인도 지원한다.

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)


이 외에도 공식 문서에 수많은 기능이 제공되어 있다. 이미지 후처리에 관한 웬만한 기능은 모두 제공하는 것 같다. 게다가 이미 피카소나 여타 다른 이미지 로딩 라이브러리에 비해 속도, 성능 면에서도 검증이 되었다. 함수명도 알아보기 직관적이고 사용도 간편해서 상당히 메리트 있는 라이브러리라고 생각된다.