챗 지피티로 공부한 내용입니다. 틀린 내용 있으면 알려주세요~
아래 블로그를 참고했습니다.
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
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에 들어가 동작하게 됩니다.
'android' 카테고리의 다른 글
17.Android 기기에 device owner를 설정하는 방법 (1) | 2024.01.05 |
---|---|
15. 안드로이드 동시성 코루틴 공부 (0) | 2023.12.14 |
12. android 여러가지 공부하기 (0) | 2023.11.29 |
11. 안드로이드 intent (2) | 2023.11.23 |
10.안드로이드 Manifest 공부 (0) | 2023.11.23 |