본문 바로가기

android

14. 안드로이드 Handler 공부

챗 지피티로 공부한 내용입니다. 틀린 내용 있으면 알려주세요~

아래 블로그를 참고했습니다.

https://velog.io/@woga1999/Android-Handler-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

Android Handler 클래스에 대하여

이 포스트는 Android Main Method에서도 필수적으로 쓰이고 있는 핸들러 클래스에 대한 이야기를 자세하게 살펴보는 포스트입니다.Handler는 Message를 MessageQueue에 넣는 기능과 MessageQueue에서 꺼내 처리

velog.io

https://brunch.co.kr/@mystoryg/84

 

안드로이드 Handler 알고 쓰자

Message Queue & Looper | 안드로이드 개발자라면 UI 작업은 별도의 스레드(이하 워커 스레드(worker thread))가 아닌 메인 스레드(main thread)에서 해야 한다는 이야기를 들어봤을 것이다. 만약 로직상 워커

brunch.co.kr

https://jeongupark-study-house.tistory.com/entry/Android-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-Thread-Handler-Looper%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

Android 백그라운드 - Thread, Handler ,Looper의 차이

누가 Thread, Handler, Looper의 차이를 물어봣는데, 알고 있는데 선듯 대답을 하지 못해서 다시 정확하게 공부하기 위해서 글을 씁니다. Thread는 간단하게 말해서 하나의 독립적인 실행 흐름으로 생각

jeongupark-study-house.tistory.com

Handler

  • 주로 UI쓰레드와 백그라운드 쓰레드 간에 작업을 스케줄링한다.
  • 메시지 및 실행 가능한 코드를 UI 쓰레드로 전달하는 데 사용됩니다.
  • Handler는 안드로이드에서 스레드 간의 통신을 쉽게 하기 위해 사용됩니다.

 

기본 개념

  • 스레드 간 통신
    • 안드로이드는 기본적으로 싱글 스레드 모델을 사용한다.
    • Handler는 다른 스레드에서 UI 스레드로 작업을 보내는데 사용된다.
  • 메시지 큐
    • Handler는 메세지와 runnable을 해당 Looper의 메시지 큐에 전달하고, 그것들을 Looper의 쓰레드에서 실행시킵니다.
    • 이 큐는 순차적으로 처리된다.
  • Looper
    • 각 스레드에는 Looper가 있으며(메인 스레드를 제외한 스레드에서는 명시적으로 루퍼를 생성해야함),  이는 메시지 큐에서 메시지를 반복적으로 꺼내와 Looper의 쓰레드에서 실행시킵니다.

 

주의 사항

  • 메모리 누수 
    • Handler는 액티비티나 프래그먼트와 강하게 결합할 수 있기 때문에 오래 지속되는 작업에서는 메모리 누수가 발생할 수 있습니다. 이를 방지하기 위해 액티비티가 소멸될 때 Handler의 작업을 취소해야합니다.
  • 스레드 안정성
    • Handler를 사용할 때는 스레드 안전성을 고려해야합니다.
    • 동시에 여러 스레드에서 같은 UI 컴포넌트를 수정하려고 하면 문제가 발생할 수 있다.

 

UI 작업을 Main Thread에서 해야하는 이유

  • 스레드 안정성
    • 안드로이드의 UI 컴포넌트는 스레드 안전하지 않다.
    • 이는 UI 컴포넌트가 여러 스레드에서 동시에 엑세스하거나 수정하는 것이 안전하지 않음을 의미한다.
    • 메인 스레드에서만 UI 작업을 수행함으로써 동시성 문제와 관련된 오류를 피할 수 있다.
  • 일관성 유지
    • 메인 스레드에서 UI작업을 수행함으로써 UI의 상태가 항상 일관되고 예측가능하게 유지된다.
    • 다른 스레드에서 UI 업데이트를 허용하면, 동시에 여러 곳에서 변경이 발생하여 UI 상태를 추적하기 어려워진다.
  • 성능 문제 방지
    • UI 컴포넌트에 대한 동시 접근을 허용하면, 복잡한 동기화 메커니즘을 구현해야할 수 있다.
    • 이러한 동기화는 성능 문제를 야기할 수 있으며, 앱의 응답성을 저하 시킬 수 있다.
  • 방법
    • Handler
    • Activity.runOnUiThread()
    • View.post()
    • AsyncTask
    • LiveData

 

Main Thread 주의점

  • Main Thread에서는 무거운 작업을 하지 말자
    • 시간이 오래 걸리는 작업을 Main Thread에서 작업하면 UI 처리가 늦게 이뤄진다. -> 반응성이 떨어진다.

 

Handler 생성자

Handler()
Handler(Handler.Callback callback)
Handler(Looper looper)
Handler(Looper looper, Handler.Callback callback)

 

  • 첫번째 생성자 부터 세번째 생성자는 결국 Handler(Looper looper, Handler.Callback callback) 생성자를 호출한다.
  • Handler는 Looper(결국 MessageQueue)와 연결되어 있다.
  • 기본 생성자는 생성자를 호출하는 쓰레드의 Looper를 사용하겠다는 의미이다.
  • Main Thread에는 내부적으로 Looper를 가지고 있고 그 안에는 MessgaeQueue를 포함하고 있다.
  • 그래서 Looper가 MessageQueue에 message나 Runnable 객체를 선입선출로 보관하였다가 차례로 꺼내게 된다.
  • 그리고 Handler는 Looper로부터 전달 받은 message나 Runnable를 처리하거나 다른 Thread로 부터 받은 message를 MessageQueue에 넣는다.

Handler

  • Handler는 MessageQueue로 부터 받은 Message나 Runnable을 처리한다.
  • Handler는 하나의 Thread와 그 MessageQueue에 종속된다.
  • 그래서 새로운 Handler를 만들 경우 그 Handler를 만든 Thread에 연결된다.
  • 다른 Thread에서 특정 handler를 통하여 Message를 전달할 경우 그 동작은 Message를 전달한 handler와 연결된 Thread의 MessageQueue에 들어가 동작하게 됩니다.