AsyncTask

2016. 4. 4. 17:43Android

반응형

android에서는 Main Thread가 UI Thread입니다. (UI관련된 작업은 UI Thread에서만 가능)
동시에 2가지 이상의 할 일이 생겼을때 사용할 수 있는 방법


1. thread를 생성하여 handler로 Main Thread와 소통할 수 있도록 해주는 방법
2. AsyncTask(Asynchronous Task)를 사용하는 방법

 

안드로이드에서는 네트워크 데이터 송수신과 같은 시간이 오래 걸리는 작업은 무조건 메인 UI 쓰레드가 아닌 별도의 쓰레드를 기동하여 처리하도록 되어 있다.(허니콤 이상부터) 이런 경우 사용할 수 있는 방법이 AscynTask 클래스를 상속하여 별도의 쓰레드를 기동하는방법이다. AsyncTask 클래스는 아래와 같은 일련의 4개의 메소드를 호출하여 쓰레드로 동작한다.

    void onPreExecute() : 쓰레드 실행 전에 호출되는 메소드

    Result doInBackgroud(Params...) : 실제 쓰레드로 기동될 메소드

    void onPostExecute(Result) : 쓰레드, 즉 doInBackground가 종료되면 호출되는 메소드

    void onProgressUpdate(Progress...) : UI 쓰레드가 publishProgress()와 같은 형태로 호출하면 언제든 실행되는 메소드


doInBackground, onPostExecute, onProgressUpdate 메소드가 어떤 자료형을 인자로 받을지, 어떤 값을 리턴할지 마음대로 결정하기 위해, AsyncTask는 generic으로 선언한다다. 즉,

    MyTask extends AsyncTask<String, int, ProgressDialog>


와 같이 선언하면, doInBackground 메소드는 String의 배열을 인자로 받고, onProgressUpdate 메소드는 int의 배열을 인자로 받으며, onPostExecute 메소드는 ProgressDialog를 인자로 받는다. 또한 doInBackground 함수의 리턴값은 ProgressDialog이어야 한다. onPostExecute 메소드는 doInBackground 메소드가 종료되면 호출되기 때문이다.

한가지 주의할점은 doInBackground 메소드는 UI 쓰레드, 즉 메인 쓰레드와는 별개의 쓰레드에 의해서 실행이 되고, 나머지 메소드들은 UI 쓰레드에 의해서 실행이 된다는 점이다. 따라서 다이얼로그와 같이 UI를 직접 수정하는 메소드나 클래스들(ProgressDialog 등)은  doInBackground 메소드 안에서 실행될 수 없지만 onPostExecute 등의 메소드에서는 실행될 수 있다. 마찬가지로 네트웍 데이터 송수신과 같은 UI 쓰레드에서 수행되어서는 안되는 작업들은 onPreExecute, onPostExecute, onProgressUpdate 메소드에서 사용해서는 안된다.

 

[출처 : http://egloos.zum.com/killins/v/3016411]

반응형

'Android' 카테고리의 다른 글

SMS 인증번호 받기  (0) 2016.04.19
웹뷰(Web View)  (0) 2016.04.18
ListActivity를 상속받아 ListView 구현  (0) 2016.04.04
이미지뷰를 사용할 때 MATCH_PARENT를 적용 안될 때  (0) 2016.04.03
imageView dim 처리  (0) 2016.04.03