네트워크 연결은 비동기로 처리하는 게 보편적이죠! 과연 안드로이드 + 코틀린에서는 어떤 방식을 많이 쓸까 알아봅시다.
종류
- doAsync
- AsyncTask
- Coroutines
Anko를 이용한 doAsync { ... }
제일 처음 발견한 방법은 Anko 라이브러리를 사용한 doAsync { ... }
입니다. 사용법 또한 간단한데요. 먼저 build.gradle (Module: app)에 Anko를 추가해줍니다.
...
dependencies {
...
implementation 'org.jetbrains.anko:anko-common:0.9' // 추가
}
이후 코드 어디서든 doAsync { ... }
에 코드를 넣어주면 비동기로 실행됩니다. 저는 아래와 같이 사용해보았습니다.
doAsync {
val doc = Jsoup.connect(url).get()
val desc = doc.select("#desc").attr("content")
}
Anko 사용은 간단하지만, 치명적인 단점이 있었습니다. Anko 공식 문서에 가보시면 deprecated, 즉 더이상 사용되지 않는 라이브러리라는 설명이 나옵니다. Anko는 성공적인 프로젝트로 더 나은 안드로이드 개발 경험을 만들어왔지만, 요즘에는 더나은 대안이 많다고 판단한 게 지원 중단 이유입니다.
https://github.com/Kotlin/anko/blob/master/GOODBYE.md#what-should-i-use-instead-of-anko
Anko는 비동기 처리 이외에도 크게 레이아웃 DSL(Domain Specific Language), 유틸리티, SQLite helper 기능을 가지고 있었고, 각각에 대해 다음과 같은 대안을 제시합니다.
What should I use instead of Anko?
Layout DSL
- Jetpack Compose. A reactive View DSL for Kotlin, backed by Google.
- Splitties – Views DSL. An extensible View DSL which resembles Anko.
Generic utilities
- Android KTX. A set of Kotlin extensions for different purposes, backed by Google.
- Splitties. A lot of micro-libraries for all occasions.
SQLite helpers
- Room. An annotation-based framework for SQLite database access, backed by Google.
- SQLDelight A type-safe API generator for SQL queries.
간단한 작업을 위한 AsyncTask
https://developer.android.com/reference/kotlin/android/os/AsyncTask.html
AsyncTask는 구글에서 공식 지원하는 라이브러리로, 간단한 비동기 작업 후 결과를 UI에 띄울 때 적합합니다. AsyncTask는 클래스를 하나 만들고 상속하여 사용하며, 비동기 작업은 네 단계로 나뉘어 수행됩니다.
[링크]
코틀린 + 영어로 선택해도 코틀린 예제가 나오지 않아 약간 애먹었지만, 코드는 다음과 같답니다. AsyncTask의 <> 속 첫 번째 자료형은 doInBackground에 전해지는 파라미터의 자료형, 두 번째는 progress를 표시할 자료형이지만 저는 사용하지 않을 것이기 때문에 Void 형을 사용하였습니다. 마지막 자료형은 onPostExecute
에서 사용할 Round 리스트 자료형입니다.
import android.os.AsyncTask
import org.jsoup.Jsoup
class Round(val round: Int, val number: List<String>, val prize: String)
class CrawlLotto: AsyncTask<Int?, Void, List<Round>>() {
private val lottoUrl = "https://m.dhlottery.co.kr/gameResult.do?method=byWin&drwNo="
override fun doInBackground(vararg params: Int?): List<Round> {
val totalRound = mutableListOf<Round>()
if (params.isEmpty()) {
totalRound.add(
crawl(lottoUrl)
)
}
for(param: Int? in params) {
totalRound.add(
crawl(lottoUrl + param.toString())
)
}
return totalRound
}
private fun crawl(url: String): Round {
val doc = Jsoup.connect(url).get()
val desc = doc.select("#desc").attr("content")
val round = """([0-9]{3})회""".toRegex().find(desc)!!.groups!!.get(1)!!.value.toInt()
val number = """당첨번호 ([0-9,]+)\+""".toRegex().find(desc)!!.groups!!.get(1)!!.value.split(",")
val prize = """당첨금액 ([0-9,]+)원.""".toRegex().find(desc)!!.groups!!.get(1)!!.value
return Round(round, number, prize)
}
override fun onPostExecute(totalRound: List<Round>) {
for(round in totalRound) {
println(round.round.toString() + " " + round.number + " " + round.prize)
}
}
}
코틀린 AsyncTask 예제가 없는 이유는 아마도 코루틴이 대세라서...가 아닐까요?
Kotlin의 장점, Coroutines!!
코루틴은 코틀린 1.3부터 추가된 긴 시간 동안 지속되는 비동기 작업을 위한 문법입니다. 사실 이걸 어떻게 적용시켜야 할 지 잘 모르겠습니다... 봐도 잘 모르겠습니다.... 그래도 도움을 얻었던 링크를 추가합니다...
공식 문서: https://kotlinlang.org/docs/reference/coroutines/basics.html
코루틴을 이해하기 위한 발악 1편 (위 문서 한국어 해설): https://wooooooak.github.io/kotlin/2019/06/18/coroutineStudy/
Kotlin Coroutines을 알아보고, 안드로이드에 library 적용하기: https://thdev.tech/kotlin/2018/10/04/Kotlin-Coroutines/
문서를 보면서 들었던 생각은.. async/await와 비슷하다는 건데, 아마 이런 말은 코틀린 개발자를 화나게 하는 것 같다...
'Android' 카테고리의 다른 글
Extension fun, 코틀린 기초 문법 (2) - Koans 풀이 (0) | 2020.01.27 |
---|---|
null? 코틀린 기초 문법 (1) - ? ?: !! (0) | 2020.01.24 |
단 5분, 단숨에 AsyncTask 완벽 정복! (0) | 2020.01.23 |
안드로이드, 코틀린?! Adapter/?? 이게 다 뭐야!! 고통스러워!!!!! (1) | 2020.01.19 |
앱 개발로 꾸준히 돈 버는 부수익 만들기 (0) | 2020.01.16 |