Problem

기존 Java로 작성된 코드를 Kotlin으로 변환할때 어떻게 하면 더 Kotlin 스타일에 맞게 변환할 수 있을까하는 고민을 하게 됐다. 동일하게 AsyncTask로 변환 할 수도 있지만 조금 더 Kotlin스타일로 변환 할 수 있는지 확인해 보고자 한다.

AsyncTask.execute(new Runnable() {
@Override
public void run() {
    ...

Solution

coroutineKotlin 1.3 버전에서 추가되었다. 그 이상 버전을 사용하는 경우만 해당한다. Kotlincoroutine를 사용하면 간단하면서 더 많은 작업을 할 수 있다1.

먼저, Android 프로젝트라면 앱의 build.gradle 파일에 다음 종속 항목을 추가한다.

dependencies {
	implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}

그리고 AsyncTask 부분을 아래 처럼 변환해 보자.

CoroutineScope(Dispatchers.Main).launch {
	...

CoroutineScope의 파라미터로 들어가는 Dispatchers의 설명은 다음과 같다.

  • Dispatchers.Default
    • 기본값, 백그라운드 스레드 풀 사용
  • Dispatchers.IO
    • IO 작업을 위함
  • Dispatchers.Main
    • UI 등 메인 스레드 처리

또한 job을 사용하면 작업이 완료 되기를 대기하거나 취소할 수도 있다2. 물론 여러 개의 job들의 동기화 처리도 가능하다.

val job = CoroutineScope(Dispatchers.Default).launch {
    ...
}

job.join()
// job.cancel()
// job.cancelAndJoin()

References