1. 안드로이드 코틀린으로 이미지 url 에서 이미지뷰에 띄우기
코루틴을 사용해서 이미지 url 을 통해 인터넷 스트림을 열어서 Bitmap 으로 가져와 ImageView에 띄워주는 코드를 작성해봅시다.
코루틴을 몰랐을 때에는 쓰레드 오류, 여러 예외들이 터지면서 이미지 로드가 제대로 안되었고, 구글링 하여 찾는 코드는 asyncTask 를 사용하는 (레거시)코드 였는데 이미지는 불러와졌는데 그래도 시원하게 뻥 뚤리는 느낌이 아니었는데 답은 코루틴에 있었습니다.
이번에 프로그래머스에서 진행하는 데브 매칭 앱 개발자 과제 또한 이미지를 불러오는 부분이 있었는데 이부분이 코루틴을 사용할 수 있냐를 넌지시 제시해 놓은 것을 이제서야 깨닫고는 왜 내가 코루틴을 공부하지 않고 테스트를 봤는지 후회가 되더라고요. 지금이라도 공부하게되어 다행이지만 아쉽기는 매한가지입니다. (데브매칭 하반기 노려봅니다)
1.1. image url string to bitmap
이미지 url 을 전달하면 비트맵으로 반환해주는 suspend 함수를 하나 작성합니다. try 문 내부에 있는 3줄 코드가 이미지를 받아오는 코드 입니다.
object ImageLoader{
suspend fun loadImage(imageUrl: String): Bitmap? {
val bmp: Bitmap? = null
try {
val url = URL(imageUrl)
val stream = url.openStream()
return BitmapFactory.decodeStream(stream)
} catch (e: MalformedURLException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
return bmp
}
}
그리고 바인딩 처리를 해주는 부분에 아래와 같이 코루틴 스코프를 사용해서 런치해주면 정상적으로 이미지가 로딩되는 것을 확인할 수 있습니다.
CoroutineScope(Dispatchers.Main).launch {
val bitmap = withContext(Dispatchers.IO){
ImageLoader.loadImage(lecture.courseImage)
}
binding.lectureImage.setImageBitmap(bitmap)
}
CoroutineScope(Dispatchers.Main).launch {
val bitmap = withContext(Dispatchers.IO) {
ImageLoader.loadImage(it.courseImageLarge)
}
binding.lectureImage.setImageBitmap(bitmap)
}
추가로 asyncTask<> 를 사용하는 레거시 코드 또한 참고로 작성해두려 했으나 깃헙에 커밋만 해두고 굳이 구버전 기술을 여기에는 작성하지 않도록 하겠습니다. 향후 코루틴 버전업이 되거나 새로운 기술이 나오면 내용 추가하도록 하겠습니다.
2021.06.22 - [Android/Kotlin] - [Android] 코틀린(Kotlin) 코루틴(Coroutine) 한 번에 끝내기
2021.06.21 - [Android] - [Android] webView 에 html String Data 넣어서 불러오기
2021.06.18 - [Android] - [Android] 코드에서 drawable 자원으로 컴포넌트 속성 설정하기
'Android' 카테고리의 다른 글
[Android] 화면 돌려도(회전시) 데이터 유지 시키기 : onSaveInstanceState (0) | 2021.07.11 |
---|---|
[Android] 커스텀 뷰 에서 엑티비티 종료 시키기 (customView finish) (0) | 2021.06.23 |
[Android] webView 에 html String Data 넣어서 불러오기 (0) | 2021.06.21 |
[Android] 코드에서 drawable 자원으로 컴포넌트 속성 설정하기 (0) | 2021.06.18 |
[Android] Intent 에 데이터(값) 넣어서 엑티비티 전환하기 (0) | 2021.06.18 |