https://soo0100.tistory.com/1599?category=847049
지난 시간 우리는 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" 라는 헬퍼클래스를 사용해야 합니다.
다음 시간에는
핸들러를 이용해서 위 코드를 정상적으로 동작 시켜보겠습니다
감사합니다. ^^
'앱 만들기 > 안드로이드 study' 카테고리의 다른 글
안드로이드 핸들러 구현 (2) | 2021.09.04 |
---|---|
안드로이드 AsyncTask 로 비동기 처리 만들어 보기 (2) | 2021.08.30 |
안드로이드 MainThread 에서 오래 걸리는 일을 하면 안되는 이유. (2) | 2021.08.28 |
안드로이드 주석처리 하기. 단축키 <CTRL>+</> (4) | 2021.08.12 |
안드로이드 에러 Caused by: android.view.InflateException 수정하기 (2) | 2021.08.11 |
댓글