ABOUT ME

Today
Yesterday
Total
  • [ Android ] 이미지 라이브러리 분석 : Glide
    Android & Kotlin 2022. 5. 4. 19:30

     

    Android 이미지 처리 라이브러리중 하나로 Picasso, Fresco 와 함께 가장 널리 사용되고 있는 라이브러리입니다.

    최근에는 Glide와 더불어 Coil이 많이 쓰인다고 합니다.

    Glide 에서도 caching 에 대해 좀 더 중점적으로 공부하고 정리해보았습니다.

     

    1.  Glide 기본 사용법 

    • 빌더 패턴을 사용하며 로딩을 위해 3가지의 함수를 호출
      • public static RequestManager with(Context context) //    Glide.java
      • public RequestBuilder load(String string) //   RequestManager.java
      • public ViewTarget<ImageView, TranscodeType> into(ImageView view) //   RequestBuilder.java
    • resizing
      • 기본 옵션은 ImageView 크기에 맞게 이미지를 resizeing 함
      • 사용자가 'override' 라는 이름의 함수를 통해 크기를 지정할 수 있음
    Glide.with(this)
          .load(url)
          .override(300,300)
          .into(imageView);
    • 이미지 변형
      • centerCrop / FitCenter / CicleCrop 등의 옵션을 추가하여 사용가능

     

    2.  Glide 임시 이미지

    옵션을 추가함으로써 요청 한 이미지를 나타내기 전까지 다른 이미지 임시로 보여줄 수 있습니다.

    • PlaceHolder
      • 네트워크의 응답을 기다리는 동안 임시로 뷰를 보여줌
    • Error PlaceHolder
      • 이미지 로드에 실패할 경우 보여주는 이미지를 설정 가능
    • Thumnail
      • 일정 퍼센트를 설정하면 해당 퍼센트의 화질에 이미지를 로드가 완료되기까지 미리 보여줌

     

    3.  Glide 캐싱 프로세스

    • 이미지는 요청 이미지 url 을 key 로서 저장된다.
    • 이미지 로드과정
      1. 메모리 캐시에 해당 이미지가 존재하는지 확인한다.
      2. 1에서 없다면 > 디스크 캐시에 해당 이미지가 존재하는지 확인한다.
      3. 2에서 없다면 > 네트워크로 해당 url 이미지를 로드한고 메모리 / 디스크 에 저장한다.
    • BitmapPool 클래스을 이용 → LinkedList 구조
      • LRU 캐싱 알고리즘 사용 : 오랫동안 참조되지 않는 객체 뒤로 밀리고 뒤에 있는 객체를 회수 해 나가는 방식
    • 디스크 캐시 옵션
      • 디스크 캐시를 사용하는 것을 디폴트로 제공하고 있다.
      • DiskCacheStrategy enum 을 인자 설정으로 캐싱 전략을 구사할 수 있다..
        • DiskCacheStrategy.NONE : Disk cache을 하지 않는다.
        • DiskCacheStrategy.SOURCE : 원본 Image만 캐싱
        • DiskCacheStrategy.RESULT : 변형된 Image만 캐싱
        • DiskCacheStrategy.ALL : 모든 Image를 캐싱
        • DiskCacheStrategy.AUTOMATIC : RESOURCE 를 기반으로 전략적인 캐싱. (Default)

     

    4.  캐싱 전략

    1. 디스크 캐시
      • mutiple size 에 대해서도 여러번 사용할 가능성이 있다면 디스크 캐시전략을 추가할 수 있다.
      val requestOptions = RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL)
      Glide.with(context).load(url).apply(requestOptions).into(imageView)
    2. 같은 URL 의 이미지 변화 : URL은 같으나 이미지(내용물)가 바뀌었을 때
      • signature 를 통해 바뀐 이미지에 대해서 새로운 이미지로 인식하고 로드함
      val requestOptions = RequestOptions()
          .diskCacheStrategy(DiskCacheStrategy.ALL)
          .signature(ObjectKey(signature))
    1. 캐시 제거
      • 사용하지 않는 캐시에 대해서 주기적으로 삭제 해준다.
     private fun clearCache() {
    
            // getPreferences 현재 엑티비티에서만 사용
            // Context.MODE_PRIVATE 내앱에서만 사용
            val shared = getPreferences(Context.MODE_PRIVATE)
            Thread(Runnable {
                val recent = shared.getLong(RECENT_CLEAR_DATE, System.currentTimeMillis())
                if (System.currentTimeMillis() - recent > ONE_MONTH) {
                    with(shared.edit()) {
                        putLong(RECENT_CLEAR_DATE, System.currentTimeMillis()).apply()
                    }
                    Glide.get(this).clearDiskCache()
                } else {
                    Log.d(TAG, System.currentTimeMillis().toString())
                    Log.d(TAG, recent.toString())
                }
            }).start()
        }

    댓글

Designed by Tistory.