- AsyncTask의 필요성
예를 들어 인터넷 속도는 접속환경에 따라 크게 다를 수 있다. 빠르면 1초이내에 뜰 수 있지만 길면 언제 화면이 표시될지 알 수가 없다.
안드로이드의 경우에는 UI쓰레드에서 5초 이상 대기하는 경우, 무한대기로 간주하기 때문에 프로세스를 강제로 종료시킨다.
그래서 인터넷이나 기타 성능에 따라 언제끝날지 알 수 없는 경우에는 다른 쓰레드로 따로 빼야할 필요가 있다.
AsyncTask의 경우에는 쓰레드와 핸들러를 이용하지 않아도 좀 더 편하게 비동기 쓰레드를 사용할 수 있다.
- AsyncTask 구조
import android.os.AsyncTask;
public class AsyncTask extends AsyncTask<String,Void,String>{
public String result;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
return result;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
- AsyncTask의 흐름
1. execute( ) 명령어를 통해 AsyncTask을 실행합니다. 2. AsyncTask로 백그라운드 작업을 실행하기 전에 onPreExcuted( )실행됩니다. 이 부분에는 이미지 로딩 작업이라면 로딩 중 이미지를 띄워 놓기 등, 스레드 작업 이전에 수행할 동작을 구현합니다. 3. 새로 만든 스레드에서 백그라운드 작업을 수행합니다. execute( ) 메소드를 호출할 때 사용된 파라미터를 전달 받습니다. 4. doInBackground( ) 에서 중간 중간 진행 상태를 UI에 업데이트 하도록 하려면 publishProgress( ) 메소드를 호출 합니다. 5. onProgressUpdate( ) 메소드는 publishProgress( )가 호출 될 때 마다 자동으로 호출됩니다. 6. doInBackground( ) 메소드에서 작업이 끝나면 onPostExcuted( ) 로 결과 파라미터를 리턴하면서 그 리턴값을 통해 스레드 작업이 끝났을 때의 동작을 구현합니다.
|
AsyncTask <Params, Progress, Result>
여기서 제네릭에 있는 인자1, 2, 3은 다음과 같다.
Params : doInBackground 파라미터 타입이 되며, execute 메소드 인자 값이 된다.
Progress : doInBackground 작업 시 진행 단위의 타입으로 onProgressUpdate 파라미터 타입이다.
Result : doInBackground 리턴값으로 onPostExecute 파라미터 타입이다.
- AsyncTask 의 제약조건 및 단점
- API16(젤리빈) 미만 버전에서는 AsyncTask 선언을 UI Thread에서 해주지 않으면 오류가 발생한다. (API 16 이상(JELLY BEAN)의 버전에서는 자유롭게 사용해도 된다고합니다.)
- excutes(Params)는 UI 스레드에서 직접호출해야합니다
- 수동으로 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) 호출하면 안됩니다.
- Task는 오직 한번만 실행될 수 있습니다.
- 하나의 객체이므로 재사용이 불가능합니다. (객체를 새롭게 생성하면 되지만 메모리 효율 나빠짐)
- 구현한 액티비티 종료 시 별도의 지시가 없다면 종료되지 않습니다.
- Activity 종료 후 재시작 시 AsyncTask의 Reference는 invalid 해지며 onPostExecute( ) 메소드는 새로운 Activit에 어떠한 영향도 끼치지 못합니다.
- AsyncTask의 기본 처리 작업 개수는 1개입니다. Async 하지 않은 AsyncTask의 변화를 아래에 적어 놓겠습니다.
출처: http://itmining.tistory.com/7 [IT 마이닝]