개요 : 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<Object, Object, Object>
- 위 세개의 타입들은 어떤 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에 대한 정리
'ANDROID의 속삭임' 카테고리의 다른 글
[android][OBJECT][AsyncTask]AsyncTask에 대한 정리 (0) | 2013.05.16 |
---|---|
[android][기초][layout]정렬 지정 (0) | 2013.05.14 |
[android][기초]프로젝트의 폴더 (0) | 2013.05.10 |
[android][maven] android에서 Maven사용하기 (0) | 2013.05.09 |
[android][googlePlayService]googleMap 연동. (0) | 2013.05.08 |