-
[Android/Kotlin] AsyncTaskAndroid/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