-
[Android] 이미지 라이브러리(glide)없이 URL로 이미지 나타내기AOS 2023. 5. 12. 21:54반응형
glide 는 android 에서 대부분 사용하는 이미지 라이브러리이다.
glide 는 기본적으로 비동기로 이미지를 로드하여 이미지뷰에 보여주고, 캐시처리를 해준다.
이러한 기능이 어떻게 동작하는지 glide 없이 직접 처리하여 공부해보자
1. 비동기 처리 ( 코루틴 )
⭐️ 비동기 처리가 필요한 이유?
네트워크를 통해 이미지를 가지고 오면서 시간이 소요된다.
이미지 다운로드를 Main thread(UI Thread)에서 구현한다면 화면이 멈춘다.
( Main Thread를 5초 이상 사용하면 ANR 이 발생한다. )
시간이 오래걸리는 작업은 별도의 Thread에서 처리하고 비동기적 처리해야한다.
Android는 네트워크를 사용하는 작업이 Main Thread 에서 처리하지 못하게 하고 있다.
별도의 Thread에서 처리하려면 AsyncTask 를 이용하거나 Threaed를 별도 생성하는 방법 등이 있다.
하지만 구글에서 AsyncTask를 deprecated 선언하고, 코루틴을 사용할 것을 추천하고 있다.
object ImageLoader { fun loadImage(url: String, completed: (Bitmap?) -> Unit) { // IO Thread 에서 처리 CoroutineScope(Dispatchers.IO).launch { // 이미지 다운 작업 val bitmap = BitmapFactory.decodeStream(URL(url).openStream()) // Main Trhead 에서 처리 withContext(Dispatchers.Main) { completed(bitmap) } } } }
IO Thread 에서 처리
이미지를 다운로드 받는 것은 네트워크를 사용하는 작업(IO 작업)이다.
Main Thread 에서 처리
이미지 다운이 완료되면 Main Thread로 전달해야한다.
2. 이미지 다운로드 오류가 발생할 경우
object ImageLoader { fun loadImage(url: String, completed: (Bitmap?) -> Unit) { // IO Thread 에서 처리 CoroutineScope(Dispatchers.IO).launch { // 다운로드 오류 처리 (null 반환) try{ // 이미지 다운 작업 val bitmap = BitmapFactory.decodeStream(URL(url).openStream()) // Main Trhead 에서 처리 withContext(Dispatchers.Main) { completed(bitmap) } } catch (e: Exception) { withContext(Dispatchers.Main) { completed(null) } } } } }
이미지 다운로드 오류가 발생할 경우 null 이 반환되도록 해야한다.
3. 이미지 캐시
⭐️ cache 처리가 필요한 이유?
같은 이미지를 매번 다운로드하려면 시간이 오래걸리고 비효율적이다.
cache 처리를 하여 bitmap을 미리 저장해두고 빠르게 접근하여 어플리케이션 성능을 향상시켜야 한다.
glide 는 기본적으로 cache 처리를 해준다.
하지만 glide 라이브러리를 사용하지 않을 경우 cache처리를 직접해줘야한다.
object ImageLoader { val imageCache = mutableMapOf<String, Bitmap>() fun loadImage(url: String, completed: (Bitmap?) -> Unit) { // 캐시 메모리에 해당 url이 있는지 확인 if (imageCache.containsKey(url)) { // 캐시 메모리에 저장된 bitmap 전달 completed(imageCache[url]) return } // IO Thread 에서 처리 CoroutineScope(Dispatchers.IO).launch { // 다운로드 오류 처리 (null 반환) try{ // 이미지 다운 작업 val bitmap = BitmapFactory.decodeStream(URL(url).openStream()) // bitmap을 캐시메모리에 저장 imageCache[url] = bitmap // Main Trhead 에서 처리 withContext(Dispatchers.Main) { completed(bitmap) } } catch (e: Exception) { withContext(Dispatchers.Main) { completed(null) } } } } }
4. View에서 ImageLoader 사용하기
ImageLoader.loadImage(이미지URL){binding.image.setImageBitmap(it)}
https://developer.android.com/topic/performance/graphics/cache-bitmap?hl=ko
반응형'AOS' 카테고리의 다른 글
[Andorid] local.properties를 이용하여 API URL, KEY 안전하게 숨기기 (0) 2023.06.13 [Android] 무한스크롤 Infinite Scroll (0) 2023.05.17 [Android] LiveData 와 Observer Pattern (0) 2023.03.20 [Android] 안드로이드 모듈화 Modularization 적용하기 (0) 2023.03.04 [Kotlin] MpAndroidChart 사용하기 / 클릭하면 x축 label 출력 (0) 2022.01.05