ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android/Kotlin] AsyncTask
    Android/Kotlin 2022. 7. 9. 18:02
    반응형

    [모든 포스팅은 개인적 공부를 위해 작성된 글입니다]

    <동기와 비동기>

    - 동기(Sync)

     - 작업을 순서대로 진행

    - 비동기(Async)

     - 작업을 따로 처리

     - 장점 : 작업이 처리되는 동안 MainThread를 기다리게 할 필요 없음

     - 네트워크, DB 작업 등에서 주로 사용

     

    <안드로이드에서 Async 다루는 방법>

    - AsyncTask 상속 받음

     - Async 통해 MainThread와 작업 Thread통신 가능

     - onPreExecute() : 쓰레드 시작 전 할 작업

     - doInBackground() : 쓰레드가 할 작업

     - onPregressUpdate() : 백그라운드 작업 중간중간 MainThread로 옴(작업 수행 정도 알려줌)

     - onPostExecute() : 작업 마치고 MainThread로 간 후

    val start: Button = findViewById(R.id.start)
    val stop: Button = findViewById(R.id.stop)
    val textView: TextView = findViewById(R.id.textView)
    val progressBar: ProgressBar = findViewById(R.id.progressBar)
    
    var task: BackgroundAsyncTask? = null
    
    start.setOnClickListener {
        task = BackgroundAsyncTask(progressBar, textView)
        task?.execute()//start
    }
    stop.setOnClickListener {
        task?.cancel(true)
    }
    class BackgroundAsyncTask(val progressBar: ProgressBar, val textView: TextView): AsyncTask<Int, Int, Int>(){
        //AsyncTask<>의 <>안에 들어가는 파라미터
        //params -> doInBackground에서 사용할 타입
        //progress -> onProgressUpdate에서 사용할 타입
        //result -> onPostExecute에서 사용할 타입
    
        var percent: Int = 0
    
        override fun onPreExecute() {
            percent = 0//작업이 시작되므로 작업 진행 percent를 0으로 함
            progressBar.setProgress(percent)
       }
    
        override fun doInBackground(vararg p0: Int?): Int {
            while(!isCancelled()){
                percent++
                if(percent>100){
                    break
                }
                else{
                    publishProgress(percent)//percent가 onProgressUpdate(의 파라미터)로 이동함
                }
                try{
                    Thread.sleep(100)
                }
                catch (e: Exception){
                    e.printStackTrace()
                }
            }//isCancelled() == 작업이 취소되었는지 확인
    
            return percent
        }
    
        override fun onProgressUpdate(vararg values: Int?) {
            super.onProgressUpdate(*values)
            //doInBackground로부터 percent(==values) 받음
            textView.setText(""+values[0]+"퍼센트")
            progressBar.setProgress(values[0] ?: 0)//values값이 null인 경우에는 0 넣겠다는 의미
        }
    
        override fun onPostExecute(result: Int?) {
            super.onPostExecute(result)
            textView.setText("작업이 완료되었습니다")
        }
    
        override fun onCancelled() {
            super.onCancelled()
            textView.setText("작업이 취소되었습니다")
            progressBar.setProgress(0)
        }
    }

     

    <AsyncTask의 단점>

    - 재사용 불가(사용할 때 마다 아래의 코드와 같이 task 생성해줘야 함)

    task = BackgroundAsyncTask(progressBar, textView)

    - Activity가 종료될 경우나 다른 Activity로 넘어간 경우 따라서 종료되지 않음

     - 종료시키려면 onPause()와 같은 곳에서 cancel 해줘야 함

    - AsyncTask는 하나만 실행될 수 있음

     - 동시에 여러 개의 AsyncTask 실행 불가(병렬 처리 불가)

     - 하나의 AsyncTask가 종료되어야 다음 AsyncTask 실행

    반응형

    'Android > Kotlin' 카테고리의 다른 글

    [Android/Kotlin] 권한(Permission)  (0) 2022.07.10
    [Android/Kotlin] 네트워크(Network)  (0) 2022.07.09
    [Android/Kotlin] Realm  (0) 2022.07.08
    [Android/Kotlin] Sharedpreference  (0) 2022.07.08
    [Android/Kotlin] TabLayout, pager  (0) 2022.07.08

    댓글

Designed by Tistory.