본문 바로가기

Programming/Android

[Android] AsyncTask

- 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( ) 로 결과 파라미터를 리턴하면서 그 리턴값을 통해

  •     스레드 작업이 끝났을 때의 동작을 구현합니다. 


  • 출처: http://itmining.tistory.com/7 [IT 마이닝]


    AsyncTask <Params, Progress, Result>


    여기서 제네릭에 있는 인자1, 2, 3은 다음과 같다.


    • Params : doInBackground 파라미터 타입이 되며, execute 메소드 인자 값이 된다.

    • Progress : doInBackground 작업 시 진행 단위의 타입으로 onProgressUpdate 파라미터 타입이다.

    • Result : doInBackground 리턴값으로 onPostExecute 파라미터 타입이다.


    - AsyncTask 의 제약조건 및 단점

     AsyncTask는 비교적 오래 걸리지 않은 작업에 유용하고, Task 캔슬이 용이하며 로직과 UI 조작이 동시에 일어나야 할 때 매우 유용하게 사용되지만 다음의 제약조건과 단점을 알고 사용해야합니다.

    [제약조건]
    1.  API16(젤리빈) 미만 버전에서는 AsyncTask 선언을 UI Thread에서 해주지 않으면 오류가 발생한다. (API 16 이상(JELLY BEAN)의 버전에서는 자유롭게 사용해도 된다고합니다.)
    2.  excutes(Params)는 UI 스레드에서 직접호출해야합니다
    3.  수동으로 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) 호출하면 안됩니다.
    4.  Task는 오직 한번만 실행될 수 있습니다.

    [단점]
    1.  하나의 객체이므로 재사용이 불가능합니다. (객체를 새롭게 생성하면 되지만 메모리 효율 나빠짐)
    2.  구현한 액티비티 종료 시 별도의 지시가 없다면 종료되지 않습니다. 
    3.  Activity 종료 후 재시작 시 AsyncTask의 Reference는 invalid 해지며 onPostExecute( ) 메소드는 새로운 Activit에 어떠한 영향도 끼치지 못합니다.
    4.  AsyncTask의 기본 처리 작업 개수는 1개입니다. Async 하지 않은 AsyncTask의 변화를 아래에 적어 놓겠습니다.



    출처: http://itmining.tistory.com/7 [IT 마이닝]