Android Java Glide의 error 이미지를 다른 이미지 링크로 대체

MSU·2024년 12월 11일

Android

목록 보기
23/36

내용 작성에 앞서 본 앱은 뷰바인딩이 적용되어있지 않은 레거시 코드로 이루어져 있어 아직 뷰바인딩으로 수정하지 않은 점 참고 부탁드립니다.

앱의 메인화면 배너 이미지를 glide를 사용하여 출력하고 있는 상태이다.
배너는 view flipper로 구성되어있어 코드로 이미지 넘기기만 가능하고 실제 기기에서 스와이프로 다음 이미지를 넘길 수가 없는 상태였다.
해당 view flipper 코드를 view pager2로 변경했고 뷰홀더 코드는 아래와 같이 작성했다.

    public class MyViewHolder extends RecyclerView.ViewHolder {

        private final ImageView mImageView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.imageSlider);
        }

        public void bindSliderImage(String imageURL) {

            Glide.with(context)
                    .load(imageURL)
                    .skipMemoryCache(true)
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .into(mImageView);
        }
    }

백업용 링크가 있어 만약 서버상의 오류로 이미지를 불러오지 못했을 시 백업용 링크를 사용하여 이미지를 불러올 수 있도록 코드를 아래와 같이 수정했다.

public void bindSliderImage(String imageURL) {

            Glide.with(context)
                    .load(imageURL)
                    .listener(new RequestListener<Drawable>(){
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            ((Activity)context).runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Glide.with(context)
                                            .load(imageURL.replace("cb","cb1"))
                                            .skipMemoryCache(true)
                                            .diskCacheStrategy(DiskCacheStrategy.NONE)
                                            .into(mImageView);
                                }
                            });
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            return false;
                        }
                    })
                    .skipMemoryCache(true)
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .into(mImageView);
        }

보통 glide의 error() 메서드가 있지만 해당 메서드는 drawable이미지만 사용이 가능하므로 url을 사용하고자 한다면 listener()메서드를 사용해야 했다.
RequestListener 인터페이스를 구현하여 onLoadFailed() 메서드를 오버라이딩 하여 그 안에 대체 url로 이미지를 띄우는 코드를 작성해주면 된다.
또한 RequestListener는 내부적으로 Worker Thread처리가 되기때문에 UI작업을 위해서는 Main Thread 처리가 필요하므로 onLoadFailed메서드 안에서 코드를 runOnUiThread()로 감싸주었다.
IllegalException이 발생한다고 하는데 아직 확인은 못했다.

아래의 블로그 글을 참고했다.
https://velog.io/@jeep_chief_14/Glide%EC%9D%98-Error-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A5%BC-%EB%8B%A4%EB%A5%B8-Url%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C-with.-RequrstListener

profile
안드로이드공부

0개의 댓글