티스토리 뷰

반응형

AsyncTask는 비동기 처리를 위해 제공되는 Class입니다.

Thread와 Handler를 같이 사용하여 Ui와 데이터 처리를 했던 것을 AsyncTask로 편하게 처리할 수 있습니다.

 

AsyncTask의 구조로는 아래와 같습니다.

  • onPreExecute - doInBackground 전에 실행됩니다. Main Thread에서 처리합니다.
  • doInBackground - 일반 Thread에서 처리합니다.
  • onProgressUpdate - doInBackground에서 publishProgress를 호출하면 Main Thread가 처리합니다.
  • onPostExecute - doInBackground 후에 실행됩니다. Main Thread에서 처리합니다.

 

class AsyncTaskActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_async_task)

        AsyncTaskClass().execute(10, 20)
    }

    inner class AsyncTaskClass : AsyncTask<Int, Long, String>() {

        override fun onPreExecute() {
            super.onPreExecute()
        }

        override fun doInBackground(vararg params: Int?): String {

            Log.i("params", "${params[0]}, ${params[1]}")

            while (true) {
                Thread.sleep(1000)
                publishProgress(System.currentTimeMillis())
            }

            return ""
        }

        override fun onProgressUpdate(vararg values: Long?) {
            super.onProgressUpdate(*values)

            asyncTask_textView.text = values[0].toString()
        }
    }
}

 

AsyncTaskClass는 AsyncTask <자료형 1, 자료형 2, 자료형 3>를 상속받고 있습니다.

 

자료형 1은 doInBackground의 파라미터 값, 자료형 3은 doInBackground의 반환 값, 자료형 2는 onProgressUpdate의 파라미터 값입니다.

 

 

doInBackground에서는 전달받은 값을 Log로 출력하게 하였습니다.

Log.i("params", "${params[0]}, ${params[1]}")

 

그리고 publishProgress를 통해 현재 시간의 초를 넘겨줬습니다.

 

 

onProgressUpdate에서는 Ui를 변경해주었습니다.

override fun onProgressUpdate(vararg values: Long?) {
    super.onProgressUpdate(*values)

    asyncTask_textView.text = values[0].toString()
}

publishProgress를 통해 받은 데이터를 적용하였습니다.

 

 

실행하면 아래와 같이 동작합니다.

반응형
댓글