본문 바로가기

Android/Kotlin

[Kotlin]AsyncTask의 사용

AsyncTask는 안드로이드에서 비동기 처리를 할 수 있게 해주는 클래스입니다. 주로 백그라운드 스레드에서 작업을 처리하고 결과를 메인 스레드에 전달하는 데 사용됩니다. AsyncTask는 추상 클래스로, 구현해야 하는 4개의 메서드가 있습니다.

  1. doInBackground(params: Params) : 백그라운드 스레드에서 실행할 작업을 정의합니다.
  2. onPreExecute() : doInBackground()가 실행되기 전에 메인 스레드에서 실행할 작업을 정의합니다.
  3. onPostExecute(result: Result) : doInBackground() 작업이 완료된 후에 메인 스레드에서 실행할 작업을 정의합니다. doInBackground()에서 리턴한 결과를 매개변수로 전달합니다.
  4. onProgressUpdate(values: Progress) : doInBackground() 작업 중에 메인 스레드에서 실행할 작업을 정의합니다. 작업 진행 상황을 매개변수로 전달합니다.

AsyncTask를 사용하는 방법은 다음과 같습니다.

  1. AsyncTask 클래스를 상속받는 클래스를 만듭니다.
  2. 필요한 메서드들을 오버라이드합니다.
  3. doInBackground() 메서드에서 백그라운드 작업을 수행합니다.
  4. onPreExecute() 메서드에서 필요한 초기화 작업 등을 수행합니다.
  5. onPostExecute() 메서드에서 doInBackground() 작업 결과를 처리합니다.
  6. 필요한 경우 onProgressUpdate() 메서드에서 작업 진행 상황을 처리합니다.

예를 들어, 다음은 AsyncTask를 사용하여 URL에서 이미지를 다운로드하는 예제입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class DownloadImageTask(val imageView: ImageView) : AsyncTask<String, Void, Bitmap>() {
    override fun doInBackground(vararg urls: String): Bitmap? {
        val url = urls[0]
        var bitmap: Bitmap? = null
        try {
            val input = java.net.URL(url).openStream()
            bitmap = BitmapFactory.decodeStream(input)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return bitmap
    }
 
    override fun onPostExecute(result: Bitmap?) {
        imageView.setImageBitmap(result)
    }
}
cs

 

이 예제에서는 DownloadImageTask라는 AsyncTask 클래스를 정의하고, doInBackground() 메서드에서 URL에서 이미지를 다운로드하고, onPostExecute() 메서드에서 다운로드한 이미지를 ImageView에 설정합니다. 이 AsyncTask 클래스는 다음과 같이 실행할 수 있습니다.

 

1
2
3
4
val url = "https://www.example.com/image.jpg"
val imageView = findViewById<ImageView>(R.id.imageView)
val task = DownloadImageTask(imageView)
task.execute(url)
cs

 

이렇게 실행하면, DownloadImageTask의 doInBackground() 메서드가 백그라운드 스레드에서 실행되고, onPostExecute() 메서드가 메인 스레드에서 실행되면서 ImageView에 이미지가 설정됩니다.