-
[ Android ] 이미지 라이브러리 분석 : GlideAndroid & 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에서 없다면 > 네트워크로 해당 url 이미지를 로드한고 메모리 / 디스크 에 저장한다.
- BitmapPool 클래스을 이용 → LinkedList 구조
- LRU 캐싱 알고리즘 사용 : 오랫동안 참조되지 않는 객체 뒤로 밀리고 뒤에 있는 객체를 회수 해 나가는 방식
- 디스크 캐시 옵션
- 디스크 캐시를 사용하는 것을 디폴트로 제공하고 있다.
- DiskCacheStrategy enum 을 인자 설정으로 캐싱 전략을 구사할 수 있다..
- DiskCacheStrategy.NONE : Disk cache을 하지 않는다.
- DiskCacheStrategy.SOURCE : 원본 Image만 캐싱
- DiskCacheStrategy.RESULT : 변형된 Image만 캐싱
- DiskCacheStrategy.ALL : 모든 Image를 캐싱
- DiskCacheStrategy.AUTOMATIC : RESOURCE 를 기반으로 전략적인 캐싱. (Default)
4. 캐싱 전략
- 디스크 캐시
- mutiple size 에 대해서도 여러번 사용할 가능성이 있다면 디스크 캐시전략을 추가할 수 있다.
val requestOptions = RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL) Glide.with(context).load(url).apply(requestOptions).into(imageView)
- 같은 URL 의 이미지 변화 : URL은 같으나 이미지(내용물)가 바뀌었을 때
- signature 를 통해 바뀐 이미지에 대해서 새로운 이미지로 인식하고 로드함
val requestOptions = RequestOptions() .diskCacheStrategy(DiskCacheStrategy.ALL) .signature(ObjectKey(signature))
- 캐시 제거
- 사용하지 않는 캐시에 대해서 주기적으로 삭제 해준다.
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() }
'Android & Kotlin' 카테고리의 다른 글
[ Android ] 안드로이드 저장소 정리 (Legacy, Scoped Storage) (0) 2022.06.12 [Android] Background Task1 : WorkManager 개념 및 예제 (0) 2022.06.07 [ Android ] CustomView 필요성 및 구현 방법 (Kotlin) (0) 2022.03.04 [ Android ] customView의 onDraw 함수 디버깅 기록 (0) 2022.03.04 [ Android ] startActivityForResult deprecated 이유와 대안( Activity Result API) (0) 2022.02.15 - 빌더 패턴을 사용하며 로딩을 위해 3가지의 함수를 호출