티스토리 뷰

dev/android

AsyncTask

altvirus 2011. 9. 30. 13:25

AsyncTask (Asynchronous Task ) class

  • 비동기적 작업 수행
  • 다운로드 작업에 많이 사용됨
  • AsyncTask 클래스 사용에 따른 제약
    • execute(params . . .) 메서드는 액티비티에서 호출한다.
    • AsyncTask 클래스 내의 onPreExecute(), onPostExecute(Result),
    • 스레드로 구현되어 있어 한 번만 사용. 반복호출시 에러발생하므로 new를 사용하여 생성.
       
AsyncTask 클래스의 파라미터 지정
  • 클래스를 상속받아 사용하기 위해서는 아래 처럼 주어지는 클래스의 파라미터들의 데이터 타입을 지정
    • private class DownloadFilesTask extends AsyncTask<Params, Progress, Result>
    • 지정하는 타입은 클래스 내부에서 사용된다.
    • Params
      • execute(Params), doInBackground(Params...) 에서 사용되는 객체의 데이터 타입
    • Progress
      • 작업 진행 상황 화면 출력
      • AsyncTask.publishProgress(Progress...), AsyncTask.onProgressUpdate(Progress...)
    • Result
      • 작업완료 후 결과로 사용하는 데이터 타입
      • AsyncTask.doInBackground(Params...) 의 작업이 완료된 후 반환되는 결과의 데이터 타입, 이 메서드가 반환하는 결과를 바로 사용하는 것은 아니다. 이 메서드의 결과는 AsyncTask.onPostExecute(Result)로 넘어간다. 따라서 액티비티에서 선언한 필드에 값을 넘기거나 저장소에 결과를 저장하는 코드는 onPostExecute(Result) 코드에서 수행하면 된다.
 
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>{
protected Long doInBackground(URL... urls) {
...
}
 
protected void onProgressUpdate(Integer... progress) {
   ...
}
 
protected void onPostExecute(Long result) {
   showDialog('  ');
}
}
 
 
 
AsyncTask  클래스의 진행 단계
  •  액티비티에서 new DownloadFilesTask().execute(url1, url2, url3);  이런 식으로 호출
  • 데이터 타입을 정할 필요가 없다면 execute(void,void,void)
  • 진행단계
    • 1단계
      • 스레드에서 execute() 호출 후 onPreExecute() 호출됨
      • 필요한 인스턴스화와 태스크의 초기화 설정작업 진행
    • 2단계
      • doInBackground(Params...) 메서드를 호출하여 다운로도, 계산등의 시간이 걸리는 작업 수행
      • doInBackground() 내부에서 publishProgress()메서드 호출하여 진행상황 출력 초기화
    • 3단계
      • onProgressUpdate() 로 진행상황 출력
    • 4단계
      • 백그라운드 작업 완료 후 onPostExecute() 메서드 호출
         
기타 AsyncTask 메서드
  • public final AsyncTask.Status getStatus()
    • 반환값 : PENDING , RUNNING , FINISHED
  • final boolean cancel(boolean mayInterruptIfRunngin)
    • mayInterruptIfRunnging을 true로 설정하고 메서드를 호출하게 되면
      • pending 상태인 경우 초기화 중단
      • running 상태인 경우 백그라운드 작업 중단
      • finished 상태인 경우 작업중단없이 false 반환. 만약 true가 반환되면 백그라운드 작업 성공적 완료를 의미
    • cancel 이 호출되면 onCancelled() 콜백메서드가 호출된다. 이 콜백메서드에 close() 등과 같은 종료 작업을 코딩

       

package com.altvirus;

import java.util.ArrayList;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.ArrayAdapter;
import android.widget.Toast;

public class MyAsyncTask extends ListActivity{
private static String[] items={"aaa", "bbb", "ccc", "ddd", "eee", "fff"};
private ArrayAdapter<String> aa;
private ArrayList<String> al = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al);
this.setListAdapter(aa);
new AddStringTask().execute(1,2);
}
class AddStringTask extends AsyncTask<Integer, String, Long>{
        @Override
        protected Long doInBackground(Integer... unused){
        
         for(int i=0; i<items.length; i++){
                publishProgress(items[i]);
                SystemClock.sleep(1000);
            }
            return 100L;
        }
        

//doInBackground() 메소드에서 publishProgress() 메소드를 호출하면
        //onProgressUpdate() 메소드에서 인자로 넘겨준 값을 받게된다
        //(사용자 인터페이스에서 실행되므로 주의)
        @Override
        protected void onProgressUpdate(String... item){
         al.add(item[0]);
         aa.notifyDataSetChanged();
        }
        
        //doInBackground() 메소드의 작업이 완료된 직후 호출됨
        @Override
        protected void onPostExecute(Long fromDIB){
        
            Toast.makeText(MyAsyncTask.this, "Done!", Toast.LENGTH_SHORT).show();
        }
    }
}




'dev > android' 카테고리의 다른 글

안드로이드 UI들 모음..  (0) 2011.11.02
AsyncTask  (0) 2011.09.30
LoadImageFromUrl  (0) 2011.01.10
공지사항