Handler, Thread

post-thumbnail

안드로이드 UI 동작

  • 안드로이드 UI처리는 Single Thread 모델로 동작
  • 다른 Thread에서 UI를 업데이트 하는 행위를 하면 안됨

왜 Single Thread?

  • 시간이 오래 걸리는 작업을 UI Thread에서 하게 되면 앱 퍼포먼스 저하를 일으킬 수 있기 때문이다.

Looper

  • 하나의 Thread는 오직 하나의 Looper를 가진다
  • Looper는 오직 하나의 Thread를 담당한다. MainActivity가 처음 실행되면 동시에 메인 Thread의 Looper가 돌기 시작한다
  • 각 Thread 내부에는 MessageQueue라는 것이 존재하는데, 여기에 해당 Thread가 처리해야할 동작들이 Message란느 형태로 쌓이게 된다
  • Looper는 궁극적으로 MessageQueue에 들어오는 Message들을 하나씩 꺼내어 이를 적절한 handler로 전달하는 역할을 한다

루퍼는 무한루프를 돈다


작업단위

  • Message는 하나의 작은 작업 단위라고 생각하면 편한데, Runnable 객체로 이루어져 있을 수도 있고 일반적인 경우 Message 객체로 이루어져 있을 수 있다.
  • Runnable, Message 객체 두가지가 있을 수 있는데, Runnable 객체가 담겨져 있으면 handler에 메세지를 전달하지 않고 run()을 수행하여 해당 Runnable 작업을 바로 시작하고, Runnable 객체가 없을 경우 Message 객체 내부에 명시돼있는 handler의 handleMessage()를 수행하며

Handler

  • 메세지를 Looper의 MessageQueue에 넣거나, Looper가 MessageQueue에서 특정 메세지를 꺼내어 전달하면 이를 처리하는 기능을 수행한다.

Looper 로 메세지를 전달하는 경우

Message 객체를 생성하여 이를 전달하는 방식으로 구현한다.

  • sendMessage()로 MessageQueue에 Message 객체를 적재
  • post로 시작하는 메소드들을 통해 Runnable 객체를 직접 적재

Looper로부터 메세지를 전달받는 경우

Looper가 메세지 큐에서 메세지 하나를 딱 꺼냈을 때,

  • Runnable 객체가 담겨있다면
    -> 해당 Runnable의 run() 메소드를 호출해서 작업을 실행

Message 객체가 담겨있다면

  • 해당 메세지 내부의 handler가 갖고있는 handleMessage()메소드를 호출함으로써 해당 Handler가 메세지를 전달받을 수 있다.

동작흐름

  1. 다른 Thread에서 특정 Thread Handler의 sendMessage() 를 활용하여 Main Thread Looper의 MessageQueue에 메세지를 전달함

  2. 해당 Thread의 Looper는 MessageQueue에서 loop()를 통해, 메세지를 하나씩 handler에 전달함

  3. Handler에서 handleMessage()를 통해 메세지 처리함

-> 메인 Thread가 갖고 있는 Looper의 MessageQueue에 다른 Thread의 결과를 활용한 작업들을 담아두면, Main Thread의 handler가 이를 차례대로 수행하게 되는 것이다.

사용해보기


var handler: Handler? = null
val thread = Thread { // Runnable 익명 객체 구현
 handler = Handler(Looper.getMainLooper())
}
thread.start()

이렇게 하지 않으면 Handler가 암시적으로 Looper를 선택하게 되는데, 이 과정에서 특정 작업이 손실되거나 충돌하는 버그가 발생할 수 있다.

Thread 통신간의 Runnable을 써야할까 Thread를 써야할까?

Thread를 사용하는 방법은 상속을 해서 run()을 재구현하는 방법이 있고 Runnable() interface를 강제구현해서 하는 방법이 있다.

profile
클린코드와 UX를 생각하는 비즈니스 드리븐 소프트웨어 엔지니어입니다.

0개의 댓글