개인공부용123 프로그래밍 블로그
[안드로이드 스튜디오] 쓰레드 -2- 본문
쓰레드 -3-
AyncTask에관한 글: http://itmir.tistory.com/624
위 링크에 AsyncTask의 설명이 잘되어있습니다.
AsyncTask는 핸들러를 사용하지않고 쓰레드를 이용한 백그라운드 작업을 하면서 UI객체에 접근할수 있게 해줍니다.
AsyncTask 클래스를 상속하여 새로운 클래스를 정의하면 그 내부에서 필요한 경우다 호출되는 메소드를 재정의하여사용할 수 있습니다.
AsyncTask에 정의된 주요 메소들에 대한 설명은 아래와 같습니다.
메소드 이름 |
설 명 |
doInBackground |
새로 만든 쓰레드에서 백그라운드 작업을 수행합니다. execute()메소드를 호출할 때 사용된 파라미터를 배열로 전달 받습니다. |
onPreExecute |
백그라운드 작업을 수행하기전 호출되며 메인 쓰레드에서 실행되고 초기화 작업에 사용됩니다. |
onProgressUpdate |
백그라운드 작업의 진행 상태를 표시하기 위해 호출됩니다. 작업 수행 중간 중간에 UI 객체에 접근하는 경우에 사용됩니다. 이 메소드가 호출되도록 하려면 백그라운드 작업 중간에 publishProgress()메소드를 호출해야 합니다. |
onPostExecute | 백그라운드 작업이 끝난 후에 호출됩니다. 메인 쓰레드에서 실행되며 메모리 리소스를 해제하는 등의 작업에 사용됩니다. 백그라운드 작업의 결과는 Result타입의 파라미터로 전달 됩니다. |
AsyncTask 객체의 cancel()메소드를 호출하면 작업을 취소할 수있는데 이떄는 onCancelled()메소드가 호출됩니다.
AsyncTask<doInBackground의 인자,onProgressUpdate의 인자,onPostExecute의 인자이면서 doInBackground의 리턴타입>
- AsyncTask 코 드 예 제 -
public class MainActivity extends AppCompatActivity {
TextView textView01;
ProgressBar progress;
BackgroundTask task;
int value;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView01 = (TextView) findViewById(R.id.textView01);
progress = (ProgressBar) findViewById(R.id.progress);
// 실행 버튼 이벤트 처리
Button executeBtn = (Button) findViewById(R.id.executeBtn);
executeBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 새로운 Task 객체를 만들고 실행
task = new BackgroundTask();
task.execute(100); // 100은 doInBackground의 인자로들어가는 수
}
});
// 취소 버튼 이벤트 처리
Button cancelBtn = (Button) findViewById(R.id.cancelBtn);
cancelBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
task.cancel(true);
}
});
}
/**
* 새로운 Task 객체를 정의
*/
class BackgroundTask extends AsyncTask<Integer , Integer , Integer> {
protected void onPreExecute() {
value = 0;
progress.setProgress(value);
}
protected Integer doInBackground(Integer ... values) {
while (isCancelled() == false) {
value++;
if (value >= 100) {
break;
} else {
publishProgress(value); // value는 onProgressUpdate의 인자
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {}
}
return value;
}
protected void onProgressUpdate(Integer ... values) {
progress.setProgress(values[0].intValue());
textView01.setText("Current Value : " + values[0].toString());
}
protected void onPostExecute(Integer result) {
progress.setProgress(0);
textView01.setText("Finished.");
}
protected void onCancelled() {
progress.setProgress(0);
textView01.setText("Cancelled.");
}
}
}
Integer .. values는 Integer[] values배열과 같습니다.
AsyncTask의 인자는 배열타입으로 들어오며 task.execute(100)와 같이 인자가 하나만 doInBackground 메소드의 인자로 들어간다 하더라도
입력받은 인자에 접근하려면 배열처럼 values[0]으로 접근해야한다.
만약 taks.execute(100,200) 으로 입력된 인자를 접근하려면 values[0] = 100 이고 values[1] = 200 입니다.
※ Do it 안드로이드 앱 프로그래밍 참조하였습니다.
'Android Studio' 카테고리의 다른 글
[안드로이드 스튜디오] View의 GONE과 INVISIBLE의 차이 (0) | 2016.12.27 |
---|---|
[안드로이드 스튜디오] 이미지를 생성하고 제거하는법 (0) | 2016.12.27 |
[안드로이드 스튜디오] 쓰레드 -2- (0) | 2016.11.08 |
[안드로이드 스튜디오] 쓰레드 -1- (1) | 2016.11.07 |
[안드로이드 스튜디오] 메모장만들기 (1) | 2016.11.07 |