Glide 이미지 라이브러리 커스터마이징

Glide의 커스터마이징은 공식 문서(영문)에 더 자세히 설명되어 있다. 내게 필요한 기능이 무엇인지 참고하고, 더 자세한 내용은 꼭 공식 문서를 보자.

Glide는 Fresco, Picasso, Universal Image Loader 등과 함께 안드로이드에서 손 꼽히는 이미지 라이브러리다. Glide를 리용하면 원격지(remote)/로컬(local) 이미지를 가져와 화면에 표시할 수 있다. 가져온 이미지는 캐싱을 통해 로딩 속도를 개선할 수 있으며, 필요하다면 이미지 모서리 깎기(rounding)같은 재처리와 애니메이티드 gif도 표시할 수 있다. 따로 HTTP 라이브러리를 쓰지 않고 동작하지만, Volley나 OkHttp 라이브러리와도 호환 동작할 수 있다. 이제는 사라진 범프(Bump) 앱에서 사용할 목적으로 개발/적용한 것이 이 라이브러리의 시작으로 알려져 있다.

Glide의 사용법은 쉬울 뿐 아니라 공식 문서(영문)가 예시와 함께 친절하게 작성되어 있다. 그러므로, 여기서는 기본적인 사용방법 보다는 Glide의 AppGlideModule를 통해 Glide의 동작을 커스터마이징을 할 수 있는 고급 옵션들에 대해 살펴보자.

Glide의 고급 설정(configuration)을 위해서는 준비가 필요하다.

  1. AppGlideModule 추상클래스의 구현체 추가
  2. @GlideModule 어노테이션을 구현체에 선언
  3. 구현체 컴파일을 위해 build.gradle에 Glide 어노테이션 프로세서 추가
  4. 프로가드 설정에 AppGlideModule 클래스의 -keep 선언 추가

준비가 끝나면, 아래와 같이 구현체의 applyOptions() 안에 고급 설정을 추가할 수 있다.

@GlideModule
public class YourGlideModule extends AppGlideModule
{
    @Override
    public void applyOptions( Context _context, GlideBuilder _builder )
    {
        // 고급 설정 추가
    }
}

메모리 캐시

GlideBuilder.setMemoryCache()를 통해, 메모리 캐시 크기를 정할 수 있다. 캐싱할 화면의 갯수를 정수로 지정하거나 직접 캐시 크기를 지정할 수 있다. 화면의 갯수로 지정할 때는  앱의 가장 긴 화면을 염두하여 지정하면 같은 이미지를 원격지에서 반복적으로 로딩하지 않고 캐싱할 수 있을 것이다.

비트맵 풀

GlideBuilder.setBitmapPoolScreens()를 통해, 비트맵 캐시 크기를 정할 수 있다. 정하는 방법은 메모리 캐시와 유사하다.

디스크 캐시

GlideBuilder.setDiskCache()를 통해, 디스크 캐시를 위한 폴더 이름과 디스크 캐시 폴더의 최대 용량를 정할 수 있다. 폴더의 기본 이름은 ‘glide’, 용량은 250mb이다.

리퀘스트 옵션 기본 값 변경

GlideBuilder.setDefaultRequestOptions()에 RequestOptions 객체를 전달하는 방식으로 변경할 수 있다. Glide.with() 메소드에서 반환하는 RequestManager.apply()를 통해 매 이미지 요청마다 설정할 수도 있지만, 여기서 설정하면 모든 요청의 기본 값으로 적용된다.

이미지 저장 방식(원본만, 재처리 후 사본 만, 모두)이나, 출처(원격지만, 로컬만, 모두), 이미지의 decode 포멧 등을 명시적으로 선언할 수 있다.

로그

GlideBuilder.setLogLevel()을 통해, 로그 레벨을 조절할 수 있다. 개발할 때는 Log.DEBUG, 공개할 때는 Log.ERROR 정도가 적당해 보인다.

모든 설정을 추가한다면, 아래와 같은 코드가 될 수 있다.

@GlideModule
public class YourGlideModule extends AppGlideModule 
{
    @Override
    public void applyOptions( Context _context, GlideBuilder _builder )
    {
        // 메모리 캐시
        MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context).setMemoryCacheScreens(2).build();
        _builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));

        // 비트맵 풀
        int bitmapPoolSizeBytes = 1024 * 1024 * 30; // 30mb
        _builder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));

        // 디스크 캐시
        int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
        _builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));

        // 리퀘스트 옵션 기본 값
        _builder.setDefaultRequestOptions(new RequestOptions().format(DecodeFormat.RGB_565).disallowHardwareBitmaps());

        // 로그 레벨
        _builder.setLogLevel(Log.DEBUG);
    }
}

그 밖에

참조

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.