본문 바로가기

Android

doAsync, AsyncTask, Coroutines 안드로이드 비동기 정답은?!

반응형

네트워크 연결은 비동기로 처리하는 게 보편적이죠! 과연 안드로이드 + 코틀린에서는 어떤 방식을 많이 쓸까 알아봅시다.

종류

  1. doAsync
  2. AsyncTask
  3. 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

 

Kotlin/anko

Pleasant Android application development. Contribute to Kotlin/anko development by creating an account on GitHub.

github.com

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  |  Android 개발자  |  Android Developers

AsyncTask abstract class AsyncTask AsyncTask enables proper and easy use of the UI thread. This class allows you to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers. AsyncTask is design

developer.android.com

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

 

Basics - Kotlin Programming Language

 

kotlinlang.org

코루틴을 이해하기 위한 발악 1편 (위 문서 한국어 해설): https://wooooooak.github.io/kotlin/2019/06/18/coroutineStudy/

 

코루틴을 이해하기 위한 발악 1편 · 쾌락코딩

코루틴을 이해하기 위한 발악 1편 18 Jun 2019 | coroutine study 코루틴이 완전히 처음이라면 코틀린 코루틴 개념익히기 추천! 코루틴은 우리가 흔히 알고 있는 함수의 상위 개념이라고 볼 수 있다. 일반 함수의 경우 caller가 함수를 호출하면 호출당한 함수는 caller에게 어떤 값을 return하고 끝이난다. 그러나 코루틴은 suspend/resume도 가능하다. 즉, caller가 함수를 call하고, 함수가 caller에게 값을

wooooooak.github.io

Kotlin Coroutines을 알아보고, 안드로이드에 library 적용하기: https://thdev.tech/kotlin/2018/10/04/Kotlin-Coroutines/

 

Kotlin Coroutines을 알아보고, 안드로이드에 library 적용하기 |

I’m an Android Developer.

thdev.tech

문서를 보면서 들었던 생각은.. async/await와 비슷하다는 건데, 아마 이런 말은 코틀린 개발자를 화나게 하는 것 같다...

반응형