Sync는 동기, Async는 비동기를 뜻한다.
장점
- MainThread를 기다리게 할 필요가 없다.
- 네트워크 작업에 매우 유용하다.
단점
- 재사용이 불가능하다.
-구현된 액티비가 종료될 때 따라 종료되지 않는다.
( Lifecycle을 활요하여( ex. onPause ) 별도로 종료 처리를 해주어야 함 )
- AsyncTask는 하나만 실행 될 수 있다. (병렬 처리 불가)
class BackgroundAsyncTask(
val progressBar: ProgressBar, val progressTextView: TextView
) : AsyncTask<Int, Int, Int>() {
var percent: Int = 0
override fun onPreExecute() {
percent = 0
progressBar.setProgress(percent)
}
override fun doInBackground(vararg params: Int?): Int {
while (isCancelled() == false){
percent++
if(percent>100) break
else publishProgress(percent)
try {
Thread.sleep(100)
}catch (e : Exception){
e.printStackTrace()
}
}
return percent
}
override fun onProgressUpdate(vararg values: Int?) {
progressBar.setProgress(values[0] ?: 0)
progressTextView.setText("퍼센트 : " + values[0])
super.onProgressUpdate(*values)
}
override fun onPostExecute(result: Int?) {
progressTextView.setText("작업이 완료 되었습니다.")
}
override fun onCancelled() {
progressBar.setProgress(0)
progressTextView.setText("작업이 취소 되었습니다.")
}
}
asyncStartButton = findViewById(R.id.async_start_btn)
asyncStopButton = findViewById(R.id.async_stop_btn)
var task : BackgroundAsyncTask? = null
asyncStartButton.setOnClickListener {
task = BackgroundAsyncTask(asyncProgressBar,asyncTextView)
task?.execute() // task 실행
}
asyncStopButton.setOnClickListener {
task?.cancel(true) // task 종료
}