앱 만들기/안드로이드

안드로이드 AsyncTask 로 비동기 처리 만들어 보기

나도 처음이야 2021. 8. 30.

비동기 처리라 함은
하나의 일이 끝나고 다음 일을 진행하는 동기식이 아닌, 병렬로 일을 진행한다는 의미입니다.
안드로이드에서는 MainThread는 주로 UI 갱신 작업을, WorkThread는 백그라운드 작업을 맡게 됩니다.
이렇게 분리되어 있기에 백그라운드 작업이 오래 걸리더라도
MainThread에서는 별도로 UI를 갱신하기에 사용자에게는 전혀 불편감을 주지 않는 것이죠.
그럼, 오늘은 안드로이드에서 제공해주는 비동기 처리를 위한 헬퍼 클래스 AsyncTask 예제를 만들어 보겠습니다.
예제의 결과 화면은 하기와 같습니다.  

다운로드 버튼을 누르면 프로그래스 바가 다운로드를 체크하고, 취소 버튼을 누르면 다운로드가 취소됩니다.

물론, 실제 다운로드하는 것은 아니고 UI 적인 표현만 한 것입니다.

결과 화면에서 UI 부분은 MainThread 이며,

다운로드를 처리하는 부분은 WorkThread 입니다. 그리고 WorkThread 에서 MainThread 의 UI를 업데이트 합니다.

오늘은 WorkThread 를 바로 안드로이드에서 지원해주는 AsyncTask 라는 헬퍼클래스를 사용해서 구현합니다.

그리고, 핸들러 가 맡았던 UI 갱신을 위한 메시지 부분도 AsyncTask 가 지원해줍니다

예제를 보겠습니다.

1. MainActivity 구성하기

public class MainActivity extends AppCompatActivity {

Button button, button2;
ProgressBar progressBar;
TextView textView;
Download download ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button = findViewById(R.id.button);
progressBar = findViewById(R.id.progressBar);
textView = findViewById(R.id.textView);
button2 = findViewById(R.id.button2);

//취소 버튼을 클릭했을때
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// cancel 상태체크하여 cancel 하기
   if(download != null && !download.isCancelled()){

     download.cancel(true);
   }

 }
});
}

//다운로드 버튼을 클릭했을때
public void onClicked(View view){

// main 쓰레드에서 AsyncTask 인스턴스와 실행코드를 넣는다.
download = new Download(this, MainActivity.this);
// AsyncTask 인스턴스는 한번만 실행 할 수 있기에, 다운로드 시 새로 생성.
download.execute();
}

 

MainActivity 에서는 화면을 구성하고, AsynTask 코드를 실행 및 cancel 하는 코드가 들어갑니다.

AsynTask 는 별도의 파일로 구성해봅니다. 다운로드 버튼을 클릭했을때 를 살펴보면,

download.execute();

해당 코드로 AsynchTask 의 인스턴스를 실행하는 것이 주요한 포인트 입니다.

그리고, 해당 인스턴스는 한번만 실행할 수 있다는 것에 주의를 해야 합니다. 

즉, 위 예제는 테스트 코드이기에 여러번 다운로드 동작을 하면 문제가 발생 할 수 있습니다.

 

취소버튼을 클릭했을때는,

AsynchTask 의 반복동작 부분을 취소해준다고 이해를 하면 됩니다.

이 부분은 AsynchTask 파일과 연결해서 보겠습니다.

   // cancel 상태체크하여 cancel 하기
   if(download != null && !download.isCancelled()){

     download.cancel(true);
   }

반응형

댓글