안드로이드에서의 이미지 처리는 꽤나 중요하고 골치아픈 영역이다.
이미지 로딩, 리소스 해제, 캐싱 등 고려해야할 여러 요소들이 많고, 이미지는 보통 한 두개가 들어가기보다
목록형으로 나열되는 경우가 많다보니 성능에 큰 영향을 미치기 때문이다.
이 포스팅에서는 다루지 않지만, 서버에서 이미지를 로드해야하는 경우에도 굉장히 좋은 퍼포먼스를 준다고 하는데
추후에 실무에서 사용하게 된다면 그때 추가로 작성할 생각이다.
1. Glide란 무엇인가
Glide는 Google에서 만든 이미지 로딩 라이브러리이다. (인수했으니까 아무튼 구글꺼)
처음 경험하는 사람도 쉽게 사용할 수 있을 정도로 직관적이고 효율적이라는 것이 큰 장점이다.
여기서, 어떤 이미지를, 어디에, 사이즈는 얼마로, 캐싱은 어떻게, 이런식으로 설정할 수 있다.
만약 로딩이 오래걸리는 이미지라면 미리 로드해놓은뒤 캐싱된 이미지를 불러와서 뿌려줄 수도 있다
나는 현재 진행중인 프로젝트에서 모든 이미지 처리를 Glide 라이브러리를 사용해서 하고 있다.
Glide/Picasso는 순수함수를 사용하기 때문에 부수효과(사이드이펙트)가 없으며,
직관적인 코드 흐름을 가지고 있는 점이 마음에 들었다.
2. Glide 사용법
Glide의 기본적인 사용법은 위와 같다.
1. Glide를 사용하기 위해서는 RequestManager 객체가 필요한데, context/activity/fragment를 파라미터로 해당 context에서 객체를 반환받는다.
2. 이후 load() 함수를 통해 불러올 이미지를 지정해주고,
3. into() 함수를 통해 이미지를 뿌려줄 view를 선택해준다.
정말 간단하고 직관적인 코드로 효율적인 이미지 로딩이 가능하다. Glide 짱!
3. 이미지 캐싱
위 메소드에서 우리는 별도의 캐시 전략을 설정해주지 않았다.
하지만 Glide 라이브러리는 이미지 초기 로딩 시 해당 이미지 캐싱을 자동으로 수행한다.
따라서 load() 함수에 파라미터로 넣어준 image 값을 변경해서 넣어도, 변경 전 이미지가 출력된다.
Glide를 처음 사용했을 때 이 부분을 몰라서 왜 이미지가 안바뀌지? 라며 해결법을 찾아다닌 기억이 난다..ㅎㅎ
그것을 방지하고 싶을 경우에 아래 함수들을 사용하여 캐싱을 비활성화할 수 있다.
그리고 NONE 이외의 다양한 캐싱 전략들에 대해 간략하게 알아보자.
(1) DiskCacheStrategy.ALL
ALL 캐싱은 모든 이미지를 캐싱하는 전략이다.
isDataCacheable, isResourceCacheable 함수로 Data/Resource의 캐싱 여부를 확인한 뒤,
decodeCacheddata/decodeCachedResource 함수로 캐싱된 데이터/이미지의 디코딩을 수행하도록 값을 반환한다.
(2) DiskCacheStrategy.DATA
DATA 캐싱은 원본 이미지만 캐싱하는 전략이다.
isDataCacheable 함수로 캐싱 여부를 확인한 뒤,
decodeCachedData 함수로 캐싱된 이미지의 디코딩을 수행하도록 true 값을 반환한다.
(3) DiskCacheStrategy.RESOURCE
RESOURCE 캐싱은 해상도를 줄인 이미지만 캐싱하는 전략이다.
isResourceCacheable 함수로 이미지 캐싱 여부를 확인한 뒤,
decodeCachedresource 함수로 캐싱된 Resource의 디코딩을 수행하도록 값을 반환한다.
(4) DiskCacheStrategy.AUTOMATIC
AUTOMATIC 캐싱은 Resource를 기반으로 전략적인 캐싱을 수행하는 전략이다.
우리가 캐싱 설정을 명시적으로 지정해주지 않으면 default로 수행되는 전략이며
앞서 말한 이미지가 캐싱되어 리소스를 변경해도 이미지가 바뀌지 않던 이유가 바로 이 전략이 default이기 때문이다.
4. 이외 다른 함수들
override()
asgif()
apply()
placeholder()
error()
fallback()
thumbnail()
preload()
'개발 > Android' 카테고리의 다른 글
[안드로이드] ViewModel에서 context를 사용하는 방법 (1) | 2023.05.10 |
---|---|
[안드로이드] AAC ViewModel과 MVVM ViewModel (0) | 2023.03.26 |
RxJava SubscribeOn & ObserveOn (0) | 2022.10.18 |
Repository 패턴을 사용하는 이유 (0) | 2022.09.07 |
[안드로이드] START_STICKY & START_NOT_STICKY (0) | 2022.05.24 |