Seize the day

POST : Android Dev Study

ExAsyncTask

AsyncTask는 가장 많이 사용되는 비동기 task를 구현하는 안드로이드 헬퍼이지만 몇 가지 문제가 있어, 이를 보완하고, 개선하여 ExAsyncTask라는 클래스를 만들게 되었다. ExAsyncTask가 AsyncTask와 비교하여 다른 점이나, 더 개선된 점은 아래와 같다.

- ExAsyncTask는 AyncTask의 기본적인 사용법이 동일하다. 기존에 AsyncTask의 이름을 ExAsyncTask로 변경하게 되면 거의 문제없이 동작한다. (Generic parameter, getStatus, cancel, onPreExecute, doInBackground, onProgressUpdate, onPostExecute, onCancelled, get)

- ExAyncTask는 추가적으로 onException(Exception ex)과 onFinally()를 제공한다. 

- ExAsyncTask는 task의 실행이 Serial하지 않다. 여러 task가 동시 실행된다.
execute()를 호출하면 이전에 실행시칸 task의 종료를 기다리지 않고 바로 실행된다. AsyncTask는 targetSdk 버전에 따라서 Serial했다가 아니었다가 했지만 최종적으로는 Serial하게 되었다. 이유가 있어서 이렇게 바뀌었겠지만 이전 task가 종료되지 않는다면 종료되기를 기다리게되고, 결국 앱이 block될 가능성이 있다. 특히 네트웍 작업을 할때 서버가 오랫동안 request의 응답을 주지 않는 경우가 있는데 이때를 대비하여 동시 실행으로 동작하는 것이 더 낫다고 본다. Serial하게동작시킬 필요가 있다면 executOnExecutor를 이용하면 된다. 

- 디버깅이 용이다. 
ThreadName을 지정할 수 있다. 디버깅할 때 좋다. 
AsyncTask의 doInBackground에서는 이 task가 어디서 call되었는지 파악이 되지 않는다. ExAsyncTask에서는 execute한 caller 쓰레드의 call stack 최근 5개를 제공한다. 역시 디버깅할 때 좋다.

-  showProgressDialog를 task에서 제공한다.
시간이 걸리는 task에 progress dialog를 띄우는 것은 자주 사용하는 패턴이지만 매번 구현하기 귀찮다. 기본적으로 task가 완료될 때까지 cancel할 수 없지만, timeout 시간(초 단위)가 지나면 cancel 버튼이 활성화되고, task를 취소할 수 있다. 무한히 기다리게 만드는 앱은 앱을 강제종료할 수 밖에 없기에 문제가 있다. 

- doInBackground에서 Exception를 catch하지 않아도 앱이 크래시되지 않는다.
OutOfMemory error가 발생하게 되면 예외적으로 System.gc()를 수행해주고 crash를 막는다. 그 외 Error는 crash된다.

ExAsyncTask.java


top

posted at

2015. 7. 12. 16:00


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크