AsyncTask는 안드로이드에서 비동기 작업을 쉽게 처리하기 위해 제공되는 클래스입니다. AsyncTask 클래스는 스레드 관리 및 UI 업데이트를 간편하게 처리할 수 있는 기능을 제공합니다.
AsyncTask는 주로 네트워크 요청, 데이터베이스 작업, 파일 입출력 등의 비동기 작업을 수행하는 데 사용됩니다. AsyncTask 클래스는 추상 클래스로 제공되며, 이를 상속하여 사용자 정의 AsyncTask를 구현합니다.
-chatGPT
쉽게 말해서 thread와 handler가 합쳐져서 손쉽게 비동기 작업을 수행할 수 있게 하는 class이다.
AsyncTask class를 상속하는데에 있어서 3가지의 generic type이 있다.
순서대로 params, progress, result인데 각각이 의미하는 바는 작업을 수행하는데에 필요한 인자, 작업의 진행정도, 작업의 결과의 데이터타입을 의미한다.
thread는 4가지의 상태를 가지고 각 상태에서 수행하는 메소는 다음과 같다.
publishProgress() 메소드를 통해서 doInBackground() 메소드에서 작업을 수행하다 중간에 업데이트 하고 싶은 내용을 인자로 하여 onProgressUpdate()를 호출할 수 있다.
실행 버튼을 누르면 상태바가 초마다 천천히 채워지는 앱을 통해 실습을 진행하겠다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"/>
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="실행" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="취소" />
</LinearLayout>
실행, 취소 버튼과 진행상황을 보여주기 위한 상태바가 UI로 구성되어있다.
public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
int value;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progressBar);
progressBar.setMax(100);
Button btn1 = findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BackgroundTask task = new BackgroundTask();
task.execute();
}
});
}
class BackgroundTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
// super.onPreExecute();
value = 0;
progressBar.setProgress(value);
}
@Override
protected Integer doInBackground(Integer... integers) {
// return null;
while(isCancelled() == false) {
value += 1;
if(value > 100) break;
publishProgress(value); // call onProgressUpdate
try{
Thread.sleep(1000);
}catch(Exception e){};
}
return value;
}
@Override
protected void onProgressUpdate(Integer... values) {
// super.onProgressUpdate(values);
progressBar.setProgress(values[0].intValue());
}
@Override
protected void onPostExecute(Integer integer) {
// super.onPostExecute(integer);
progressBar.setProgress(0);
}
}
}
주목할 부분은 AsyncTask를 상속받은 BackgroundTask class이다.
각각의 쓰레드 상태마다 수행할 메소드를 정의했다. onPreExecute()에서는 value값을 초기화하고, doInBackground()에서는 실질적으로 value값을 늘려가며 progress bar에 value값을 통해 ui를 업데이트하기 위해 onProgressUpdate()를 호출하고 onProgreeUpdate()에서는 ui를 업데이트하며 마지막으로 onPostExecute에서는 모든 작업이 종료된 후 progressBar를 초기화한다.