아직도 Android 앱에서 AsyncTask를 사용하고 있나요? 당신은 아마 더 이상 존재해서는 안 됩니다. 이를 Kotlin의 코루틴으로 대체하는 방법은 다음과 같습니다.
오랫동안 Android에서는 앱을 만들 때 비동기적으로 작업을 수행해야 한다면 아마도 AsyncTask를 사용했을 것입니다. AsyncTask는 백그라운드에서 작업을 쉽게 실행하고 완료되면 값을 반환하는 Android 프레임워크의 API입니다. 그리고 그것은 의미가 있습니다. Kotlin의 코루틴과 달리 AsyncTask는 한동안 사용되어 왔으며 바로 내장되어 있습니다.
그러나 AsyncTask의 디자인 철학과 구현은 수년이 지나면서 다소 구식이 되었습니다. 그 때문에 구글은 AsyncTask API가 더 이상 사용되지 않습니다.. 원한다면 계속 사용할 수 있지만 Google은 그렇게 하지 않는 것을 권장합니다. 다행히도 Kotlin 언어의 기능인 코루틴을 포함하여 AsyncTask에 대한 다양한 대안이 있습니다.
Kotlin의 코루틴 API는 다양한 작업을 수행할 수 있는 매우 강력한 프레임워크입니다. 이 기사는 가능한 것의 표면만을 긁어볼 것입니다. AsyncTask에서 코루틴으로 마이그레이션하는 데 필요한 기본 사항을 살펴보겠습니다.
코루틴 지원 추가
코루틴 사용을 시작하기 전에 실제로 프로젝트에 코루틴을 추가해야 합니다.
Kotlin 지원 추가
이미 Kotlin을 구현했다면 다음 섹션으로 건너뛰세요. 그렇지 않으면 프로젝트에 Kotlin 지원을 추가해야 합니다. 자세한 내용은 기존 프로젝트에 Kotlin을 추가하는 방법에 대한 튜토리얼을 확인하세요.
코루틴 라이브러리 추가
모듈 수준에서 build.gradle
, 다음 종속성을 포함합니다.
dependencies {
...
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.5.0'
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.5.0'
}
프로젝트를 동기화하면 이제 Kotlin의 코루틴을 사용할 수 있습니다.
코루틴 사용
CoroutineScope 구현
코루틴을 사용하려면 CoroutineScope 인스턴스를 사용할 수 있어야 합니다. 이를 수행하는 쉬운 방법은 포함 클래스에서 구현하는 것입니다.
예를 들어 활동에서 CoroutineScope를 구현하려면 다음을 수행하세요.
classSomeActivity : AppCompatActivity, CoroutineScope by MainScope() {
...
override fun onDestroy(){
super.onDestroy()
cancel()
}
}
그러면 SomeActivity가 MainScope 클래스를 통해 CoroutineScope 인터페이스를 구현하게 됩니다. MainScope는 CoroutineScope에 대한 모든 구현 논리를 처리하는 동시에 CoroutineScope 메서드를 사용할 수 있도록 허용합니다. 부름 cancel()
~에 onDestroy()
활동이 종료된 후 비동기 논리가 계속 실행되지 않는지 확인합니다.
AsyncTask를 코루틴으로 교체
백그라운드에서 장기 실행 작업을 수행하고 결국 문자열을 반환하는 활동 내에 AsyncTask가 있다고 가정해 보겠습니다. 다음과 같은 것.
private inner classSomeTask : AsyncTask
() {
override fun doInBackground(vararg params: Void): String {
try {
//Pretend this is an actual operation that takes 10 seconds and not just sleeping.
Thread.sleep(10000);
} catch (e: InterruptedException) {}
return"SomeString";
}
override fun onPostExecute(result: String) {
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
이것을 코루틴으로 바꾸는 것은 쉽습니다. 그냥 사용 async()
방법. 코틀린의 async()
시작된 스레드에서 실행되지만 비동기적으로 수행됩니다. 이는 올바른 스레드 사용에 대해 걱정할 필요 없이 뷰 등을 업데이트할 수 있음을 의미합니다.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...private fun doOperation(){
async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = "SomeString"
}
}
}
보시다시피 코루틴을 사용하는 것은 AsyncTask를 사용하는 것보다 훨씬 간단할 수 있습니다. 꼭 전화만 할 필요는 없어요 async()
그래도 그 일을 하게 놔두세요. 이에 대한 참조를 보유하고 완료될 때까지 기다릴 수도 있습니다.
val asyncJob = async {
//Some operation
}
//Pause here until the async block is finished.
asyncJob.await()
//This won't run until asyncJob finishes, but other operations started before the job, or started from another method, can still run.
doSomethingElse()
비동기로 값 반환
다음에서 값을 반환할 수도 있습니다. async()
네가 원한다면. 따라서 원래의 예는 다음과 같을 수 있습니다.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
val asyncJob = async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)//Whatever the type is of the last line is what async() eventually returns.
"SomeString"
}val result = asyncJob.await()
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
withContext 사용
편의를 위해 Kotlin은 다음을 제공합니다. withContext()
. 이는 전체를 인라인화합니다. await()
그냥 당신에게 가치를 반환합니다.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
//Run asynchronously on the main Thread.
val result = withContext(Dispatchers.Main) {
delay(10000)"SomeResult"
}
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
결론
위의 예는 시작하기 위한 Kotlin 코루틴의 몇 가지 기본 사용법입니다. 코루틴을 활동이나 적절한 수명 주기가 있는 항목으로 제한할 필요가 없습니다. 기본적으로 어디에서나 실행할 수 있습니다. 비동기 논리를 실행할 스레드를 선택하는 것과 같은 고급 작업도 있습니다. 이 가이드는 주로 간단한 AsyncTask를 간단한 코루틴으로 바꾸는 방법을 보여주기 위한 것입니다.
코루틴의 작동 방식과 고급 기능을 활용하는 방법에 대한 자세한 내용은 다음을 확인하세요. 공식 Kotlin 문서.