[Android] AsyncTask 알아보기 & 실습

Jinny·2021년 3월 31일
0

Android

목록 보기
24/32

🚩 Async란?

Sync는 동기, Async는 비동기를 뜻한다.

🔸 동기(Sync) 방식

  • 작업을 순서대로 진행한다.
  • 코드의 윗부분부터 아랫부분까지 실행되어진다.
    ex. A -> B -> C -> D

🔸 비동기(Async) 방식

  • Thread를 만들어서 작업을 따로 처리한다.

🚩 Async의 장점과 단점

  • 장점
    - MainThread를 기다리게 할 필요가 없다.
    - 네트워크 작업에 매우 유용하다.

  • 단점
    - 재사용이 불가능하다.
    -구현된 액티비가 종료될 때 따라 종료되지 않는다.
    ( Lifecycle을 활요하여( ex. onPause ) 별도로 종료 처리를 해주어야 함 )
    - AsyncTask는 하나만 실행 될 수 있다. (병렬 처리 불가)

🚩 Android에서 Async를 다루는 방법

  • AsyncTask를 상속받는다.
  • 필요 함수들을 Implement 한다.
    - onPreExecute() : Thread가 출발하기 전 실행할 작업
    • doInBackground() : Thread 진행 시 해야할 작업
    • onProgressUpdate() : 진행되어 상태가 update 될 때
    • onPostExecute() : doInBackground가 끝났을 때 (작업이 완료) 실행된다.

🚩 AsyncTask 실습해보기

  1. 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("작업이 취소 되었습니다.")
    }
}
  1. View에서 버튼 클릭 시 사용되도록 설정한다.
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 종료
}

👩‍💻 결과

profile
신입 개발자👩‍💻

0개의 댓글