궁금한게 많은 개발자 노트

[ Android ] AsyncTask 본문

App Development

[ Android ] AsyncTask

궁금한게 많은 개발자 2020. 11. 25. 15:26

이전에 Service에서 UI수정을 위해 handler와 looper의 사용법에 대해 알아본적이 있다.
UI수정은 sub thread가 아닌 main thread에서만 일어나야 하기 때문에, 그 해결법을 위해 handler생성 시
main looper를 받아와 해결하거나, runOnUiThread를 사용하여 해결할 수 있다고 마무리했었다.

 

그 외에도 요즘 업무를 하는데 있어서, 안드로이드로 액티비티나 서비스를 만들다보면, 기본 main thread로 돌아가는 것 이외에 다른 thread를 사용하여 병렬적으로 동작을 수행해야하는 경우가 많았다. 그래서 새로운 thread를 생성하여 거기서 일어나는 연산이나 ui처리를 진행할때 가장 적합한게 무엇일까를 찾다가 async task라는 것을 찾아서 사용해보게 되었다.

 

Async Task가 좋은점은 하나의 thread 클래스 안에서, 복잡한 구조 이해없이 main thread에서 일어나는 UI의 수정도 가능하며, 원하는 병렬처리도 동시에 가능하기 때문이다.
먼저 아래의 Async Task의 생명주기를 살펴보자.

  • 먼저, execute() 명령어를 통해 AsyncTask을 실행한다.

  • AsyncTask로 백그라운드 작업을 실행하기 전에 onPreExcuted( )실행된다.
    이 부분에는 UI변경이 가능하며, 스레드 작업 이전에 수행할 동작을 구현합니다. 

  • 새로 만든 스레드에서 백그라운드 작업을 수행합니다.
    execute() 메소드를 호출할 때 사용된 파라미터를  전달 받습니다.

  • doInBackground() 에서 중간 중간 진행 상태를 UI에 업데이트 하도록 하려면,
    publishProgress() 메소드를 호출 합니다. 호출 시에는 onProgressUpdate()가 호출된다.

  • onProgressUpdate() 메소드 메인 쓰레드에서 돌고 있으므로 중간 중간 UI업데이트 가능.

  • doInBackground() 메소드에서 작업이 끝나면 onPostExcuted() 로 결과 파라미터를 리턴하면서
    그 리턴값을 통해 스레드 작업이 끝났을 때의 동작을 구현 및 마지막 UI업데이트 가능

 

이처럼 하나의 AsyncTask를 구현함으로써, 해당 thread가 수행하는 작업 시작전, 중간, 마무리에서 UI를 수정할 수 있는
큰 장점을 가지고 있다.

 private class SampleAsyncTask extends AsyncTask<Params, Progress, Result> {
     @Override
     protected Progress doInBackground(Params... params) {
         ...
     }

     @Override
     protected void onProgressUpdate(Progress... progress) {
         ...
     }

     @Override
     protected void onPostExecute(Result result) {
         ...
     }
 }

 

보통은 위의 3가지 method를 overriding하여 기본적인 작업을 끝낼 수 있지만, 필요에 따라 위에 보이는 step에서 원하는 method를 목적에 맞게 overriding하여 사용하면 될 것이다.
여기서 유의할점은 처음 AsyncTask를 extends할때 인자로 주는 3가지 Generic Type이다.
순서대로 Params는 doInbackground에서 사용되는 parameter로 사용되며 하나이상의 parmeter를 execute()에 넣어줌으로써 전달이된다. 두번째 Progress는 doInbackground에서 publishProgress에서 사용될 parameter type이고,
마지막으로 Progress는 doInbackground의 return값이자 onPostExecute의 parameter type이다.

이처럼 생성할 때, 각 단계에서 필요한 타입이 무엇인지를 생각하고, 전체 AsyncTask의 생명주기를 살펴본다면
효율적으로 sub thread를 통해 병렬처리 및 UI 업데이트가 가능할 것이다.

Comments