[Android] AsyncTask 사용법

Song-YunMin·2020년 11월 24일
0

Java

목록 보기
4/4

AsyncTask 개념

- execute() 명렁어를 이용하여 AsynkTask를 실행합니다.
- AsyncTask로 Background 작업을 실행하기 전, onPreExcuted()가 실행됩니다.
- 새로 만든 Thread 에서 Background작업을 수행합니다. execute() Method를 호출할 때 사용된 Parameter를 전달 받습니다.
- doInBackground()에서 중간 준강 진행 상태를 UI에 업덱이트 하도록 하려면 publishProgress() Method를 호출합니다.
- onProgressUpdate() Method는 publishProgress()가 호출 될 때마다 자동으로 호출됩니다.
- doInBackground() Method에서 작업이 끝나면 onPostExcuted()로 결과 Parameter를 Return 하면서 Return 된 값을 통해 Thread Task가 끝났을 때의 동작을 구현합니다.

핵심은 onPreExecute(), onProgressUpdate(), onPostExecute() Method는 Main Thread에서 실행되므로 UI Object에 자유롭게 Access할 수 있어요.

AsyncTask<Params, Progress, Result>

- Params : doInBackground Parameter Type이며, execute Method인자 값이 됩니다.
- Progress : doInBackground Task때, 진행 단위의 Type입니다. onProgressUpdate Parameter Type 입니다.
- Result : doInBackground 리턴값 입니다. onPostExecute Parameter Type임.

Example

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // 버튼을 클릭하면 파일 다운로드 경로를 파라미터로 AsyncTask 실행
    public void OnClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                try {
                    new DownloadFilesTask().execute(new URL("파일 다운로드 경로1"));
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    private class DownloadFilesTask extends AsyncTask {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Long doInBackground(URL... urls) {
                // 전달된 URL 사용 작업

            return total;
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            // 파일 다운로드 퍼센티지 표시 작업
        }

        @Override
        protected void onPostExecute(Long result) {
            // doInBackground 에서 받아온 total 값 사용 장소
        }
    }
}

AsyncTask 제약조건

- API16(젤리빈) 미만 버전에서는 AsyncTask 선언을 UI Thread에서 해주지 않으면 오류가 발생한다.
- excutes(Params)는 UI스레드에서 직접호출해야 함.
- 수동으로 onPreExecute(), onPostExecute(Result), doInBackground(Params...),
onProgressUpdate(Progress...) 호출하면 안됨.
- Task는 오직 한번만 실행될 수 있음

AsyncTask 단점

- 하나의 객체이므로 재사용이 불가능 합니다.
- 구현한 Activity 종료 시 별도의 지시가 없다면 종료되지 않습니다.
- Activity 종료 후 재시작 시 AsyncTask의 Reference는 invalid 되며, onPostExecute() Method는 새로운 Activity에 어떠한 영향도 끼치지 못합니다.
- AsyncTask의 기본 처리 작업 개수는 1개입니다.

출처

https://itmining.tistory.com/7

profile
고독한 서버 개발 3년차

0개의 댓글