“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
회사에서 Glide를 사용하여 Bitmap으로 가져온 이미지를
byteArray로 변환하여 intent로 넘겨주는 코드를 작성했는데
byteArray가 intent에 담기지 않은 이슈가 있었다.
장장 4시간을 삽질한 끝에..
Glide는 내부적으로 비동기 처리가 된다는 것을 간과하고
이에 대응하지 않아서 Glide로 이미지를 받기도 전에 intent를 넘겨버려서
byteArray가 담기지 않았던 것이다..
그래서 오늘 Glide의 비동기 처리에 대해서 간단하게 작성해보자 한다.
binding.btnGlide.setOnClickListener {
var bitmap: Bitmap? = null
runBlocking(Dispatchers.IO) {
// 동기
bitmap = Glide.with(this@MainActivity)
.asBitmap()
.load("https://media.npr.org/assets/img/2022/03/22/halo_105_0792_rt-46c374e1b2872235e833a0eded1be39dc3e2cd07.jpg")
.submit()
.get()
binding.ivGlide.run {
post {
setImageBitmap(bitmap)
}
}
}
}
보통은 into(view)
메소드를 통해 ImageView에 이미지를
넣을 수 있었지만 submit()
메소드를 통해
동기식으로 데이터를 반환받을 수 있다.
반환받을 수 있는 데이터 형식은 아래와 같다.
단 반환받을때 각 형식 그대로 받는 것이 아니라
FutureTarget<>
제네릭 클래스를 통해서 반환받으며
위 클래스는 백그라운드에서 블로킹된 상황에서 처리할 것을 권장하고 있다.
필자는 간단하게 runBlocking
을 사용하여 구현했지만
가장 좋은 방법으론 Coroutine을 활용하여 withContext를 통해
받는 것이 가장 좋을 것 같다.
binding.btnGlide.setOnClickListener {
var bitmap: Bitmap? = null
CoroutineScope(Dispatchers.Main).launch {
// 동기
bitmap = withContext(Dispatchers.IO) {
Glide.with(this@MainActivity)
.asBitmap()
.load("https://media.npr.org/assets/img/2022/03/22/halo_105_0792_rt-46c374e1b2872235e833a0eded1be39dc3e2cd07.jpg")
.submit()
.get()
}
binding.ivGlide.setImageBitmap(bitmap)
}
}
ImageView에 Bitmap을 넣을 때 post처리를 하지 않아도 되고
좀 더 간결해진 거 같다.
-- Blog footer --
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.
즐겁게 읽었습니다. 유용한 정보 감사합니다.