코딩하는 개굴이

[JAVA/안드로이드] Handler, Looper, Thread 본문

안드로이드

[JAVA/안드로이드] Handler, Looper, Thread

개굴이모자 2022. 9. 7. 23:26
반응형

항상 한 세트로 등장하지만 정확히 무엇인지 모르겠던 저 세가지 아이들을 한꺼번에 정리해보려한다.

 

아래 나올 내용들을 한줄 정리로 스포해보자면 결론적으로 Handler, Looper, Thread 사이의 관계는

Handler, Looper는 Thread에 사용되는 역할이라는 것이다.

 

 

시작하기 전에, 이 모든 설명은 Android 의 "Single Thread System" 으로부터 뻗어나가기 때문에

정확히 무엇인지 모르겠다면 아래 포스팅에서 관련 내용을 참고하는 것을 권장하고 싶다.

 

https://yejinson97gaegul.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9D%98-SingleThread-%EC%83%81%ED%83%9C%EC%99%80-MultiThread-%EC%83%81%ED%83%9C

 

[안드로이드] SingleThread 상태와 MultiThread 상태

시작하기 전에 # Thread란? Thread가 무엇인지 알아보기 위해서는 Program, Process, Thread 사이의 관계를 아는 것이 이해에 도움이 될 것이다. - Program : 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 "정

yejinson97gaegul.tistory.com

 

 

Android 의 "Single Thread System" 의 원칙

위 문서에 언급되어있지만 Android의 Single Thread System 은 두가지 원칙이 존재한다.

  1. MainThread인 UI Thread 를 중지(Block)하지 않는다.
  2. Android의 UI Toolkit(TextView, ImageView 등..)은 전부 MainThread에서만 접근 가능하다.

따라서, 긴 시간이 걸리는 작업을 MainThread에서 작업할 경우 UI의 처리는 미뤄질 수 있다. 이것이 지속되면 ANR(Application Not Responding) 오류가 발생한다.

 

 

 

그렇다면, 오래 걸리는 작업들은 어떻게 처리해야하는 것일까?

 

Android에서는 MainThread에서 여분의 Thread 즉 SubThread를 가져와 DB, REST(서버 통신) 등의 오랜 시간이 걸릴 수 있는 작업들을 수행하며 이를 MultiThread 방식이라고 한다.

 

 

MultiThread 방식

위의 설명처럼 MultiThread 를 사용한다고 가정해보자. 만일 그럴 경우, MainThread와 SubThread가 동시에 UI 처리를 시도할 경우는 어떻게 될까?

 

만일 각 Thread 들의 동기화가 충분히 되지 않는다면 오작동이 발생할 것이다.

따라서, Android에서는 오작동을 막기 위해 Thread 간의 통신을 필요로하며 이를 위해 Handler와 Looper가 사용되는 것이다.

 

 

 

(이 설명까지 먼길을 돌아왔다. 드디어 본론이다!)

Handler

Handler는 작업(Message, Runnable)을 다른 Thread에 보내거나(post(new Runnable()) Looper에게 전달받은 작업을 처리한다. (handle Message()) 보낸 작업은 보낸 Thread의 Message Queue에 담긴다.

 

# post로 작업을
다른 Thread에 보내기
보내고 싶은 Thread의 Handler를 호출해 post를 실행해 넣는다.
예시로, MainThread에 보내고자 할 때는 
mainThreadHandler.post(new Runnable())
이렇게 수행되게 될 것이다.

 

 

Looper

Thread 내에서 Message Queue를 탐색하며 작업이 생기면 Handler로 전달하는 역할을 수행하며 Thread 당 1개만 가질 수 있다.

  • prepare(): Looper를 생성한다.
  • loop(): MessageQueue에 생긴 작업을 handler로 전달한다.
  • quit(): Looper를 종료한다.
  • quitSafely(): Queue의 작업을 전부 완료한 후 종료한다.

 

 

 

둘 간의 관계를 간략히 그림으로 축약해보았다.

Looper와 Handler의 관계

 

Looper와 Handler는 Thread간의 통신을 위해 사용하며,

Handler는 작업을 다른 Thread에 보내거나 Looper에게 전달 받은 작업을 처리하는 역할을 수행하고,

Looper는 MessageQueue를 탐색하며 작업이 생기면 이를 Handler로 전달하는 역할을 수행한다.

 

 

반응형
Comments