티스토리 뷰
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 |
공지사항