본문 바로가기
언어 공부/Android

[Android/Java] 그냥 UI를 변경하려고 하는데 오류는 왜 나오는걸까 ? - Thread Error

by 안다니. 2022. 7. 21.
반응형

 

Android 이미지 출처 : 구글 이미지

 

 

  안녕하세요 오늘은 작업을 하면서 나왔던 오류들에 대해서 적어볼까 합니다. 

 

  안드로이드를 개발하다 보면 스레드를 정말 많이 사용하게 되는데 그 이유는 안드로이드 자체에서 스레드를 나누기 때문입니다. 그냥 UI 변경 코드를 넣다 아래와 같은 오류를 만난 적이 있을 겁니다.

 

"Only the original thread that created a view hierarchy can touch its views."

 

  에러를 확인하면 메인 스레드에서만 UI를 처리를 할 수 있다고 합니다. 만약 스레드가 여러 개 있다면 , 동시에 같은 UI 자원에 접근하는 것을 막기 위해서 그렇습니다. 만약 같은 UI 자원에 접근해 작업하다가 다른 쪽이 수정을 요구한다면 작업이 명확해지지 않기 때문입니다. 그렇기에 하나씩 순차적으로 처리를 할 수 있게 도와주면 됩니다. 여러 가지 방법이 있습니다.

 

 

1. Handler 사용

2. runOnUiThread 메소드를 사용

3. AsyncTask를 사용이 있는데 deprecated 되었다.

 

Android는 Single Thread 체제입니다.

반응형

0.

 

 

UI Thread 이미지 출처 : itmining.tistory.com

 

1. Thread 


프로세스 내에서 실행되는 세부 작업의 단위입니다. 안드로이드를 작업하면 많은 스레드가 만들어집니다.

 


2. Message Queue 

 

Queue는 순차적으로 무언가를 담을 수 있는 자료구조입니다. 여기서는 그러면 작업이 될것입니다. 이 Message Queue에 데이터를 순차적으로 넣어주는 것이 Hanlder입니다.


3. Handler 
핸들러는 두가지 기능이 있습니다.
첫째: Looper에게서 순차적으로 받은 자료를 일정 시간동안 수행하는 기능 
둘째: 외부 스레드로 부터 받은 메시지를 Message Queue에 집어 넣어 UI 수정을 가능하게 합니다.  


4. Looper 
Message Queue에 담겨져 있는 자료를 순차적으로 꺼내서 Handler에게 전달해 줍니다

반응형

1.

 

  Handler란 무엇인가? 

 

  Handler는 메인 스레드의 객체이기 때문에 문제없이 UI 처리가 가능하다.  그래서 Handler란  Worker Thread에서 Main Thread로 메세지를 전달하는 역할을 한다.

 

  그럼 Main Thread와 Worker Thread는 무엇인가?

 

  흔히 Main Thread는 작업 시간이 짧고, UI 작업을 많이 합니다. 

  반대로 Worker Thread는 작업 시간이 길고 UI 작업 외 네트워크나, DB 처리 등 다양한 일을 처리하게 됩니다.

 

  그렇다면 Wokrer Thread에서는 UI를 바꾸지 못할까요? 어떠한 응답을 받을 때 UI를 변경해주면 참 좋을 텐데요? 그런 상황에서 필요한 것이 바로 Handler입니다. 

 

 

 아래와 같이 사용을 하면 됩니다.

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        // UI 작업이 가능해졌습니다.
      }
 }, 0);

 

  간단하게 말하면 Handler를 통해 Main Thread의 Looper를 가져옵니다. 그리고 post를 통해 제가 원하는 작업을 전송한다라고 생각하면 될 것 같습니다. 

 

반응형

2. 

 

  runOnUiThread는 현재 스레드가 Main Thread라면 UI 변경이 즉시 가능하고, 만약 Woker Thread라면 이벤트 큐에 저장이 됩니다. 그리고 변경이 됩니다. 

 

 

사용 방법은 아래와 같이 아주 단순하다.

runOnUiThread(new Runnable() {
  @Override
  public void run() {
    //여기다가 UI 변경을 작성한다
  }
});

  

 

 

 

  결국 중요한 건 Main Thread의 개념과 Worker Thread의 개념을 가지고 작업을 하면 더 좋을 것 같습니다 : ) 안드로이드는 계속 정책이 변하기 때문에 찾아보고 알아가는 게 중요한 거 같습니다. 그럼 즐겁게 개발하시면 좋겠습니다.

 

 

긴 글 읽어주셔서 감사합니다 : )

반응형

댓글