AsyncTask 란?
asynchronous Task class executed by background thread
용도?
Background에서 Task를 수행하면서 UI Thread로 결과를 보낼 때
AsyncTask <Prams, Progress, Result>
Params: Background에서 실행되는 태스크로 입력되는 데이터 타입
Progress: Background Thread의 doInBackground에서 UI Thread의 onProgressUpdate로 전달되는 데이터 타입
Result: Background Thread에서 만들어 Callbak FUnction으로 보내지는 Data type
주요 메소드
- onPreExecute
- Task 실행 전에 Task를 setup하는데 사용함
- doInBackground()
- 코드 내용이 Background Thread로 수행됨.
- 여기서 UI처리를 하게되면 큰일남.. (이유는 추후..)
- onProgressUpdate()
- Background 작업 실행 동안, UI 진행과정을 표현
- UI 작업 시, publishPorgress 호출을 통해 onProgressUpdate 메소드에서 UI작업 수행
- onPostExecute(Result)
- doInBackground method 종료 후 호출됨, Result Parameter 를 전달받음.
- 보통 리소스를 해제하는 역할 (ex. 상태바 (progress bar) 해제)
- onCancelled()
- doInBackground 에서 수행중인 작업이 취소된 시점에 호출됨.
주의 사항
보통 Activity의 inner class로 만듦. (∵ Thread 종료시, Activity UI 접근 수행이 잦음)
Background Task가 Activity 참조하고 있는 시점에서 갑자기 종료시
보통의 경우는 Garbage Collector 가 Memory Leak를 막아 주는데, 이 때는 Activity를 참조하고 있으므로
Memory Leak 발생. (Garbage collection 이 일어나지 않음.)
☞ inner class 는 instance 중첩 class 이다. 이는 outer class member에 access 가능하나,
asynctask는 static class 형태로 만들기를 권장한다.
(∵ inner class로 Async Task Class 선언시 outer class가 해제되어도 strong reference가 자동 생성되고
이는 Garbage Collection에 의해 해제되지 않기 때문이다.)
inner 없이 calss 선언시 static class 로 생성된다. 이는 outer class member access 불가능.
static으로 할 경우 outer classs 접근이 어려우므로
WeakReference 를 주로 사용.
WeakReference로 Activity를 참조하라!
val activityReference = WeakReference(context)
//weakReference 를 통해 activity resource 접근이 가능해진다.
val activity = activityReference.get()
// 이제 activity 로 acitivity member accessable
[Reference]
https://developer.android.com/reference/android/os/AsyncTask?hl=en
'Android' 카테고리의 다른 글
[Android] drawable resize, customizing (0) | 2020.06.20 |
---|---|
[Android] BroadCast Receiver (0) | 2020.06.18 |
[Android] Setting Export/Import (0) | 2020.05.04 |
[Android] Android Studio 자주쓰는 단축키 정리 (0) | 2020.05.04 |
[Android] Back Stack & Task (0) | 2020.05.01 |