본문 바로가기

ANDROID의 속삭임

[android][OBJECT][AsyncTask]AsyncTask를 사용하기.

개요 : android.os.NetworkOnMainThreadException 가 발생했다. 

이유를 구글에서 검색 해보니, 허니컴 이후 부터 발생되는 에러로 네트워크 관련 처리를 메인 쓰레드에서 처리 할 경우 발행 한다고 한다. 그래서 나 또한 방법을 찾을수 밖에 없었고, AsyncTask객체와의 만남이 시작 되었다.


- Thread를 이용한 경우 안드로이드에서는 UI접근하기가 어려워진다. 이런경우 또한 AsyncTask를 사용한다.

- API : http://developer.android.com/reference/android/os/AsyncTask.html

- Android에서는 AsyncTask는 쓰레드 관리와 UI쓰레드와의 통신을 원활하게 도와주는 WrapperClass이다.


※ AsyncTask 예제 

//해당 클래스를 사용 하기위해서는 subclassing을 사용하여야 한다.

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     
protected Long doInBackground(URL... urls) {
         
int count = urls.length;
         
long totalSize = 0;
         
for (int i = 0; i < count; i++) {
             totalSize
+= Downloader.downloadFile(urls[i]);
             publishProgress
((int) ((i / (float) count) * 100));
             
// Escape early if cancel() is called
             
if (isCancelled()) break;
         
}
         
return totalSize;
     
}

     
protected void onProgressUpdate(Integer... progress) {
         setProgressPercent
(progress[0]);
     
}

     
protected void onPostExecute(Long result) {
         showDialog
("Downloaded " + result + " bytes");
     
}
 
}

※ AsyncTask 인자.

- AsyncTask<URL, Integer, Long>

- 첫번째 인자 (URL) : 새로운 쓰레드에게 전해주는 인자라고 보면된다.

- 두번째 인자 (Integer) : 쓰레드의 작업이 얼마 정도 진행 되었는지 알려주는 인자의 개체.

- 세번째 인자(Long) : 마지막 결과를 가지고 오는 인자이다.

- AsyncTask<ObjectObjectObject>

- 위 세개의 타입들은 어떤 Object도 될수 있다.

AsyncTask<Void, Void, Void>

- 만약 이 세개의 항이 필요 없을시에는 Void를 쓰면 된다.


※ doInBackground(Params... params) 

- AsyncTask객체에서 반드시 오버라이드해주어야 하는 함수이다.

- 해당 메소드 안에 있는 코드는 UI쓰레드가 아닌 별개의 쓰레드에서 실행된다.

- 해당 메소드는 별개의 쓰레드에서 동작을 함으로 다른 메소드에 간섭 할수 없다.

    - 만약 간섭을 하고싶다면  publishProgress()를 호출하는 방법이나 핸들러를 사용하여야 한다.


※ onProgressUpdate(Integer ... progress)

- 중간중간 작업의 진행정도를 알릴때 사용되는 함수이다.

- 이함수의 호출은 직접 적으로 하지 못한다. doInBackground에서 publishProgress()를 호출 해주면 된다.

- 이유는 다른 UI의 스레드를 허용 하지 않기 때문에 우회 하는 것이다.

onProgressUpdate는 UI쓰레드에서 실행되고, doInBackground는 별개의 쓰레드에서 동작한다. 이것을 publishProgress가 연결 시켜 준다.

 

※ onPostExecute(Long result)

- doOnBackgroud함수가 작동을 마치면 실행되는 함수이다. 

    - 마지막에 실행되는 메소드.

UI 쓰레드에서 실행된다.




이후글 : 2013/05/16 - [ANDROID의 속삭임] - [android][OBJECT][AsyncTask]AsyncTask에 대한 정