안드로이드 앱 개발 공부/안드로이드 기본(노션 이동)

Thread 와 Handler

플래시🦥 2023. 3. 4.
반응형

💡 UI 작업은 Main Thread에서 처리해야 한다?!

→ 성능을 위해 멀티스레드를 많이 사용하지만 UI를 업데이트하는 데는 단일 스레드 모델이 적용된다. 멀티 스레드로 UI를 업데이트하면 동일한 UI 자원을 사용할 때 교착 상태(deadlock), 경합 상태(race condition) 등 여러 문제가 발생할 수 있어서 UI 업데이트를 메인 스레드에서만 허용한다.

  • 앱 프로세스가 시작되면 메인 스레드가 생성된다. 컴포넌트의 생명주기 메서드와 그 안의 메서드 호출은 기본적으로 메인 스레드에서 실행된다. 메인 스레드는 UI를 변경할 수 있는 유일한 스레드이기 때문에 메인 스레드를 UI 스레드로 부르기도 한다.

 

 💡 Thread(스레드)

  • 동시 작업을 위한 하나의 실행 단위
  • 앱을 실행하면 앱의 기본 실행을 담당하는 메인스레드가 시작
  • 필요에 의해 스레드를 만들고 파일과 ui리소스에 접근할 경우 문제가 생길 수 있음.
  • 어떤 스레드의 작업을 먼저 처리할지 몰라 데드락 발생

 

 💡 Handler(핸들러)

  • 스레드의 문제를 해결하기 위해 메인 외의 다른 스레드는 별도의 제어를 통해 UI를 다뤄야 함
  • 핸들러는 각각의 스레드 안에 만들어질 수 있고, 다른 스레드에서 요청하는 정보를 메시지 큐를 통해 순서대로 실행시켜 줄 수 있기 때문에 리소스에 대한 동시 접근의 문제를 해결해 줌
  • 메인 스레드에 핸들러를 만들어 놓으면 다른 스레드에서 특정 작업을 핸들러에 요청하고 핸들러는 메시지큐를 통해 순차적으로 처리할 메시지를 전달하는 역할

 

참조 : https://velog.io/@dlrmwl15/안드로이드-스레드 Thread와-핸들러 Handler

 

핸들러를 사용할 때 필요한 세 가지 단계

  • obtainMessage() : 호출의 결과로 메시지 객체를 리턴 받게 함
  • sendMessage() : Message Queue에 넣음
  • handleMessage() : 메서드에 정의된 기능이 수행됨

 

 💡 Looper 클래스

  • 스레드별로 Looper 생성
  • -Looper는 TLS(thread local storage)에 저장되고 꺼내어진다. ThreadLocal <Looper>에 set() 메서드로 새로운 Looper를 추가하고, get() 메서드로 Looper를 가져올 때 스레드별로 다른 Looper가 반환된다. 그리고 Looper.prepare()에서 스레드별로 Looper를 생성한다. 특히 메인 스레드의 메인 Looper는 ActivityThread의 main() 메서드에서 Looper.prepareMainLooper()를 호출하여 생성한다. Looper.getMainLooper()를 사용하면 어디서든 메인 Looper를 가져올 수 있다.
  • Looper별로 MessageQueue 가짐
  • -Looper는 각각의 MessageQueue를 가진다. 특히 메인 스레드에서는 이 MessageQueue를 통해서 UI작업에서 경합 상태를 해결한다.
728x90
반응형

댓글