개인공부용123 프로그래밍 블로그

[안드로이드 스튜디오] 쓰레드 -2- 본문

Android Studio

[안드로이드 스튜디오] 쓰레드 -2-

개인공부용123 2016. 11. 10. 23:42

쓰레드 -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 안드로이드 앱 프로그래밍 참조하였습니다.