앱 만들기/안드로이드

안드로이드 작업 쓰레드 만들어서 오래걸리는 일 해보기

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

https://soo0100.tistory.com/1599?category=847049 

 

안드로이드 MainThread 에서 오래 걸리는 일을 하면 안되는 이유.

안드로이드에서 우리가 프로젝트를 만들면, 기본적으로 MainThread 하나를 가지고 시작합니다. 바로, Oncreate() 로 구성된 이 부분이 MainThread 를 이루고 있는 뼈대입니다. public class MainActivity extends..

soo0100.tistory.com

지난 시간 우리는 MainThread 에서는 오래걸리는 작업을 하면 안되는 이유에 대해서

알아보았습니다.

MainThread 에서는 우선적으로 화면에 보이는 작업이 우선이 되어야 하기때문이죠.

그렇기에 오래걸리는 작업은 WorkThread 인 작업 쓰레드를 별도로 만들어서 작업해야 합니다.

그럼 2부로 Thread 를 만들어서 지난 시간 작업했던 내용들을 기술해봅시다.

 

지난 시간 버튼을 클릭했을때 오래 걸리는 작업을 MainThread 에 하기 처럼 넣어보았습니다.

 

//버튼을 클릭했을때
public void onClicked(View view){
//ANR 발생함.
for(int i=0 ; i <= 100 ; i++) {
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
     // 프로그래스 바에 진행률을 표시한다.
     progressBar.setProgress(i);
     textView.setText(i);
}

 

결과는 ANR 이 발생했습니다.

그렇기에 별도의 Thread 를 만들어서 처리 해봅니다.

public void onClicked(View view){

new Thread(new Runnable() {
@Override
public void run() {
for(int i=0 ; i <= 100 ; i++) {
  try {
       Thread.sleep(1000);
       } catch (InterruptedException e) {
       e.printStackTrace();
      }
    // 프로그래스 바에 진행률을 표시한다.
    progressBar.setProgress(i);
    textView.setText(i + "%");
    }
   }
}).start();

 

위 코드에서는

쓰레드를 만들었고, Thread.sleep() 함수의 일도 잘 소화해냅니다.

하지만, 결과는 앱이 죽습니다. 하기 코드에서 말이죠.

 

   // 프로그래스 바에 진행률을 표시한다.
    progressBar.setProgress(i);
    textView.setText(i + "%");
    }

 

이게 무슨 일 일까요?

별도의 Thread 를 만들어서 오래된 일을 처리했고, MainThread 의 UI 오브젝트들을 업데이트 해달라고 했을뿐인데 말이죠.

 

맞습니다. 우리의 잘못은 아니죠 ^^

그저 안드로이드의 규칙일 뿐입니다.

안드로이드에서는 WorkThread 작업 쓰레드에서 MainThread 의 UI 를 위처럼 직접 갱신하게 되면 앱이 죽습니다.

그래서, WorkThread 에서 MainThread 의 UI 갱신을 위해서는 "핸들러" 혹은 "AsynchTask" 라는 헬퍼클래스를 사용해야 합니다.

 

다음 시간에는

핸들러를 이용해서 위 코드를 정상적으로 동작 시켜보겠습니다

감사합니다. ^^

반응형

댓글