본문 바로가기
Android

[Android] Coroutine을 이용해 AsyncTask 만들어 보기

by 준그래머 2024. 3. 20.
반응형

[Android] Coroutine을 이용해 AsyncTask 만들어 보기

AsyncTask가 deprecated 되었지만 AsyncTask의 기능은 여전히 필요하다. 때문에 Coroutine을 이용해 AsyncTask와 똑같이 동작하는 CoroutineTask라는 클래스를 만들어 보았다.

 

 

CoroutineTask는 추상 클래스로 생성하고 제네릭 타입으로 T1, T2를 받아 함수들을 처리한다.

abstract class CoroutineTask<T1, T2> {

    private var argument: T1? = null
    private var result: T2? = null

}

 

 

AsyncTask의 함수와 동일한 함수를 추상 함수로 선언했다.

abstract class CoroutineTask<T1, T2> {

    ...
    
    protected abstract suspend fun onPreExecute()
    protected abstract suspend fun doInBackground(argument: T1?): T2
    protected abstract suspend fun onPostExecute(result: T2?)

}

 

 

execute함수가 호출되면 onPreExecute → doInBackground → onPostExecute 순으로 동작하도록 했다.

abstract class CoroutineTask<T1, T2> {

    ...

    fun execute(arg: T1) = CoroutineScope(Dispatchers.Main).launch {
        argument = arg
        onPreExecute()
        result = withContext(Dispatchers.IO) {
            doInBackground(argument)
        }
        onPostExecute(result)
    }

    ...
    
}

 

전체 코드

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

abstract class CoroutineTask<T1, T2> {
    private var argument: T1? = null
    private var result: T2? = null

    fun execute(arg: T1) = CoroutineScope(Dispatchers.Main).launch {
        argument = arg
        onPreExecute()
        result = withContext(Dispatchers.IO) {
            doInBackground(argument)
        }
        onPostExecute(result)
    }

    protected abstract suspend fun onPreExecute()
    protected abstract suspend fun doInBackground(argument: T1?): T2
    protected abstract suspend fun onPostExecute(result: T2?)
}

 

호출 코드

object : CoroutineTask<Void?, Void?>() {
    override suspend fun onPreExecute() {
    }
    override suspend fun doInBackground(argument: Void?): Void? {
        return null
    }
    override suspend fun onPostExecute(result: Void?) {
    }
}.execute(null)
반응형