반응형
AsyncTask
AsyncTask란?
Thread와 Handler의 사용 대신, UI상에서 간단하게 비동기 작업을 수행할 수 있도록 도와주는 클래스
-> Thread와 달리 UI 요소를 직접 접근하여 사용할 수 있음 (doInBackground() 메소드 제외)
AsyncTask<Param1, Param2, Param3> 상속
- Param1 : AsyncTask에 전달할 자료형
- Param2 : 작업 진행상태를 표시할 자료형
- Param3 : AsyncTask 수행 후 반환할 결과의 자료형
전달할때, 자료형은 반드시 클래스 형태로 전달되어야함 (ex: int x , Integer o)
반환할 자료형이 없으면 Void
AsyncTask 동작의 예
(소스코드)
public class MainActivity extends AppCompatActivity {
final static String TAG = "MainActivity";
TextView textView;
TextAsyncTask textAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.btnStart1:
// AsyncTask 생성 후 실행
textAsyncTask = new TextAsyncTask();
textAsyncTask.execute("hi!", "hello!"); // 매개변수 전달, strings[] 에 전달됨
Toast.makeText(this, "AsyncTask Start!", Toast.LENGTH_SHORT).show();
break;
case R.id.btnStop:
if (textAsyncTask != null) textAsyncTask.cancel(true); // AsyncTask 중지
break;
case R.id.btnStart2:
Toast.makeText(this, "Click!!!", Toast.LENGTH_SHORT).show();
break;
}
}
// String 타입의 매개변수를 전달받음, Integer 타입으로 진행상태 정보 표시, Integer 타입의 결과 생성
class TextAsyncTask extends AsyncTask<String, Integer, Integer> {
final static String TAG = "TextAsyncTask";
// asynctask.execute 실행 후, 순서 1 => 작업 수행 전 초기화 작업이 필요시
// 메인 쓰레드와 다른 실행 흐름이 아니므로 TextView에 setText실행 가능
@Override
protected void onPreExecute() {
textView.setText(textView.getText() + "\nonPreExecute() is performed!" + "\n");
}
// 순서 2
/* 필수 구현 => 비동기 방식으로 수행해야 할 작업
excute(...) 에 입력한 매개변수를 배열 형태로 전달 */
@Override
protected Integer doInBackground(String... strings) { //strings : 배열
Log.d(TAG, " Async start! " + strings[0] + " " + strings[1]);
// AsyncTask에서 해야할 작업
int sum = 0;
for (int i=1; i <= 100; i++) {
sum += i;
Log.d(TAG, "value: " + i);
// onProgressUpdate에 매개변수 전달하여 호출
publishProgress(sum, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
return sum; //결과를 Integer로 반환
}
// 진행 상태를 doInBackgrouund의 publishProgress() 로부터 전달받음
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(TAG, "sum: " + values[0]);
textView.setText("value: " + values[1] + "\n");
}
// @Override
// protected void onCancelled(Integer n) {
// textView.setText(textView.getText() + "Stop button is clicked!! " + n);
// }
// AsyncTask 중지 시 호출
@Override
protected void onCancelled() {
textView.setText(textView.getText() + "Interrupted!");
Log.d(TAG, "Stop button is clicked!");
}
// 순서 3 : 실행이 된 후
// doInBackground() 가 반환한 결과값을 전달 받음
@Override
protected void onPostExecute(Integer n) {
textView.setText(textView.getText() + "sum: " + n + "\n");
}
}
}
[처음 실행시, 실행 도중]
[실행 후]
반응형
'Android' 카테고리의 다른 글
[Android/kotlin] okhttp & retrofit으로 json 파싱하기 (4) | 2021.01.29 |
---|---|
[Android] 팔레트 항목 뜯어보기 (0) | 2021.01.21 |
[Android] 스레드(Thread)와 핸들러(Handler) (0) | 2021.01.20 |
[Android] Intent(인텐트) (0) | 2021.01.20 |
[Android] LifeCycle (0) | 2021.01.07 |