Developer MJ Story

[Android/AsyncTask] AsyncTask 활용하기 본문

Software/Android

[Android/AsyncTask] AsyncTask 활용하기

집근처 2014. 6. 9. 18:25
반응형
  • AsyncTask는 말 그래도 비돛기적으로 Android 내에서 Thread를 대신해 background에서 작업을 수행하는 class
  • 특히 background 스레드가 UI위젯과 자주 통신을 해야 할 수록 빛을 볼 수 있는 것이 AsyncTask
  • AsyncTask
    • AsynckTask는 main Thread 입장에서 볼 대 비동기적으로 작업 수행
    • AsynckTask<Params, Progress, Result>
      • Params: background작업시 필요한 data의 type지정
      • progress: background 작업 중 진행상황을 표현하는데 사용되는 data를 위한 type 지정
      • Result: background 작업 완료 후 리턴 할 data의 type 지정
    • AsynckTask에서 사용되는 함수들
      • onPreExecure()
        • background 작업이 시작되자마자 UI 스레드에서 실행될 코드를 구현
          • e.g. background 작업의 시작을 알리는 text 표현, background 작업을 위한 progressBar popup 등
      • doInbackground()
        • Background에서 수행할 작을 구현, execute() 메소드에 입력된 인자들을 전달 받음.
      • onprogressUpdae()
        • publishProgress() 메소드 호출의 callback으로 UI스레드 보여지는 background 작업 진행 상황을 update 하는 부분을 구현
          • e.g. ProgressBar 증가
      • onPostExecute(Result result)
        • doInBackground()가 리턴하는 값을 바탕으로 UI 스레드에 background 작업 결과를 표현하도록 구현
          • e.g. background작업을 계산한 결과를 UI에 표현
      • onCalcelled()
        • AsyncTask:cancel(Booean) 메소드를 사용해 AsyncTask인스터스의 background 작업을 정지 도는 실행 금지 시켰을 때 실행되는 callback, background 작업의 정지에 따른 리소스 복구/ 정리

 

  • 아래 소스코드는 Wi-Fi Hotspot을 on/off 하는 코드중 AsyncTask subclass 부분만 발췌

class SetWifiAPTask extends AsyncTask<Void, Void, Void> {

        booleanmMode//enable or disable wifi AP

        booleanmFinish//finalize or not (e.g. on exit)

        ProgressDialog d;

 

public SetWifiAPTask(boolean mode, boolean finish, Context context) {

            mMode = mode;

            mFinish = finish;

            d = new ProgressDialog(context);

        }

 

        @Override

        protectedvoid onPreExecute() {

            super.onPreExecute();

            d.setTitle("Turning WiFi AP " + (mMode?"on":"off") + "...");

            d.setMessage("...please wait a moment.");

            d.show();

        }

 

@Override

        protectedvoid onPostExecute(Void aVoid) {

            super.onPostExecute(aVoid);

            try {

                d.dismiss();

                WifiAPActivity.updateStatusDisplay();

            } catch (IllegalArgumentException e) {

 

            };

            if (mFinish){

                finish();

            }

        }

 

@Override

        protected Void doInBackground(Void... params) {

            setWifiApEnabled(mMode);

            returnnull;

        }

    } 


 

 

  • 유의 사항
    • AsyncTask클래스는 항상 subclassing하여 사용
    • AsyncTask인스턴스는 항상 UI 스레드에서 생성
    • AsyncTask: execute() 메소드는 항상 UI 스레드에서 호출
    • AsyncTask의 callback 함수 onPreExecute(), doInBackground, onProgressUpdata(), onPosExecute()는 직접 호출하면 안되고callback으로만 사용


반응형