원문보기:링크

RequestBuilder options

대부분의 Glide option 들은 RequestOptionsapply() 클래스를 사용하여 적용 할 수 있습니다.

사용 가능한 옵션들은 다음과 같습니다.

  • Placeholders
  • Transformations
  • 캐싱
  • 인코딩 퀄리티나 Bitmap 디코드 설정과 같은 컴포넌트 특화 옵션

예를 들어, CenterCrop Transformations 같은 경우 아래와 같이 사용 할 수 있습니다.


Glide.with(fragment)
    .load(url)
    .centerCrop()
    .into(imageView);

RequestOptions

만약, 옵션을 앱의 각기 다른 부분에서 일관적으로 적용하고 싶다면 새로운 RequestOptions 인스턴스를 만들고, 이를 각각 호출부에서 부르면 됩니다.

RequestOptions cropOptions = new RequestOptions().centerCrop(context);
...
Glide.with(fragment)
    .load(url)
    .apply(cropOptions)
    .into(imageView);

apply() 는 여러번 불릴 수 있으며, RequestOption 들을 다양하게 적용 할 수 있습니다. 만약 RequestOptions 간의 충돌이 있을 경우 마지막에 호출된 옵션이 적용 되게 됩니다.

TransitionOptions

TransitionOptions 는 로드가 완료되었을 때에 대한 옵션 입니다.

TransitionOption 은 다음과 같을 때 사용 합니다.

  • View 가 나타날 때
  • Placeholder 에서 fade in / out 이 나타날 때
  • transition 이 없는 경우

transition 이 없는 경우, 이미지가 즉각적으로 나타게 됩니다. 이러한 즉각적인 변경을 피하려면 view 의 Drawable 들 사이에 페이드 인 / 아웃을 TransitionOptions 을 이용하여 적용 할 수 있습니다.

예를들어 fade in / out 을 적용 할 경우 아래와 같이 할 수 있습니다.

import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;

Glide.with(fragment)
    .load(url)
    .transition(withCrossFade())
    .into(view);

RequestOptions 와는 다르게 TransitionOptions 는 Glide 에 의해 불려지는 리소스의 타입에 따라 달라지게 됩니다.

결론적으로, Bitmap 에 대해서는 DrawableTransitionOptions 보다는 BitmapTransitionOptions 사용해야 하며, cross fade 를 사용하는 것 보다는 단순한 fade in 을 사용하는 것이 좋습니다.

RequestBuilder

RequestBuilder 는 Glide 의 요청에 기본이 되는 것으로 url 이나 모델로 부터 로딩을 시작할 때 사용되는 옵션들을 모아주는 역할을 합니다.

RequestBuilder 는 다음을 정할 수 있습니다.

  • 불러오려는 리소스의 타입 (Bitmap, Drawable, 등등)
  • 리소스를 로드할 URL/모델
  • 로드한 리소스를 적용할 View
  • RequestOption 을 적용할 오브젝트
  • TransitionOption 을 적용할 오브젝트
  • 불러오려는 thumbnail()

RequestBuilderGlide.with() 를 호출하고, as 메소드 중 하나를 이용하여 가져 올 수 있습니다.

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).asDrawable();

아니면, Glide.with()load() 를 이용 할 수도 있습니다.

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).load(url);

리소스 타입 고르기

RequestBuilders 는 로드할 타입들을 구체화 시켜 주며, 기본적으로 Drawable 타입을 가집니다. 타입은 as... 함수를 이용하여 변경 가능 합니다. 예르 들어, asBitmap() 을 호출하게 된다면 BitmapRequestBuilder 를 얻게 될 것 입니다.

RequestBuilder<Bitmap> requestBuilder = Glide.with(fragment).asBitmap();

RequestOptions 적용

위에서 말씀드린 것 처럼, apply() 를 사용해서 RequestOptions 를 적용할 수 있으며, transition() 을 사용해서 TransitionOptions 를 적용할 수 있습니다.

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).asDrawable();
requestBuilder.apply(requestOptions);
requestBuilder.transition(transitionOptions);

또한, RequestBuilder 는 재사용 가능 합니다.

RequestBuilder<Drawable> requestBuilder =
        Glide.with(fragment)
            .asDrawable()
            .apply(requestOptions);

for (int i = 0; i < numViews; i++) {
   ImageView view = viewGroup.getChildAt(i);
   String url = urls.get(i);
   requestBuilder.load(url).into(view);
}

썸네일 요청

Glide 의 thumbnail() API 는 RequestBuilder 를 특정하고, 메인 요청과 병렬로 실행 될 수 있게 해 줍니다. thumbnail() 은 메인 요청이 로딩되는 동안 나타날 수 있습니다. 만약 메인 요청이 썸네일 요청 전에 끝나게 될 경우, 썸네일 요청 건은 보이지 않게 됩니다. thumbnail() API 를 사용하게 되면 고해상도의 이미지가 로딩 되는 동안 저해상도의 이미지를 쉽고 빠르게 로드해 둘 수 있으므로, 로딩 표시를 보는데 걸리는 시간을 줄 일 수 있게 됩니다.

thumbnail() API 는 로컬에 있는 이미지나, 원격에 있는 이미지에 모두에 유용 합니다. 특히 낮은 해상도의 썸네일이 매우 빠르게 로드될 수 있는 Glide의 디스크 캐시에 있는 경우에는 더욱 유용합니다.

thumbnail() API 는 다음과 같이 간단하게 사용 할 수 있습니다.

Glide.with(fragment)
  .load(url)
  .thumbnail(Glide.with(fragment)
  .load(thumbnailUrl))
  .into(imageView);

이 방법은 thumbnailUrl 의 이미지가 주 이미지 url 보다 낮은 해상도일 경우 더 잘 동작 합니다. 다수의 이미지를 로딩하는 API 의 경우 url 에서 원하는 이미지의 크기를 정할 수 있고, 이는 특히 thumbnail() API 에서 잘 동작 합니다.

만약 로컬에서의 이미지를 로딩 한다거나, 하나의 원격 이미지 url 만 있을 경우, Glide 의 overridesizeMultiplier API 를 사용하여 썸네일 요청시 낮은 해상도의 이미지를 썸네일로 사용할 수 있도록 해줍니다.

int thumbnailSize = ...;
Glide.with(fragment)
  .load(localUri)
  .thumbnail(Glide.with(fragment)
    .load(localUri)
    .override(thumbnailSize))
  .into(view);

sizeMultiplier 를 파라미터로 사용하는 thumbnail() 함수를 이용하여 ViewTarget 의 크기 배율에 맞추어진 모델을 불러올 수 있습니다. :

Glide.with(fragment)
  .load(localUri)
  .thumbnail(/*sizeMultiplier=*/ 0.25f)
  .into(imageView);

실패 시 새 요청 시작하기

Glide 4.3.0 부터 error API 를 사용해서 요청 실패 시 재시작 요청을 위한 RequestBuilder 를 쉽게 설정 할 수 있습니다. 예를 들어, primaryUrl 이 실패할 경우 fallbackUrl 로 재 시도하는 경우를 아래와 같이 설정 가능 합니다. :

Glide.with(fragment)
  .load(primaryUrl)
  .error(Glide.with(fragment)
      .load(fallbackUrl))
  .into(imageView);

primaryUrl 에 대한 요청이 성공 할 경우 error RequestBuilder 는 실행되지 않습니다. thumbnail()error() RequestBuilder 를 둘 다 설정 했을 때 thubnail 요청이 성공했을지라도, primaryUrl 이 실패할 경우 RequestBuilder 는 실행 됩니다.

컴포넌트 옵션

Option 클래스는 Glide 컴포넌트에 ModelLoaders , ResourceDecoders , ResourceEncoders , Encoders 과 같은 파라미터들을 추가할 수 있게 해줍니다. Glide 의 몇몇 컴포넌트들은 Option 을 포함하고 있고, 사용자 정의 컴포넌트에도 Option 을 추가할 수 있습니다.

RequestOptions ㅡㄹ래ㅡ를 사용해서 Glide 요청들에 Option 를 추가할 수 있습니다. :

import static com.bumptech.glide.request.RequestOptions.option;

Glide.with(context)
  .load(url)
  .apply(option(MyCustomModelLoader.TIMEOUT_MS, 1000L))
  .into(imageView);

새로운 RequestOptions 객체는 다음과 같이 생성 할 수 있습니다. :

RequestOptions options = new RequestOptions()
  .set(MyCustomModelLoader.TIMEOUT_MS, 1000L);

Glide.with(context)
  .load(url)
  .apply(options)
  .into(imageView);

혹은 Generated API 를 사용도 가능 합니다.:

GlideApp.with(context)
  .load(url)
  .set(MyCustomModelLoader.TIMEOUT_MS, 1000L)
  .into(imageView);