본문 바로가기

공부/Android

[Android] Handler

앱의 인트로 화면을 구현하기위해 인터넷에 돌아다니는 예제들을 보던 도중, Handler 객체를 생성해서 postDelayed()메소드의 run()메소드를 실행하는 내용이 있었다.


어제는 Inflater 개념을 공부했었는데, 오늘은 Handler를 만났다.


어제 Inflater랑 재밌게 놀았으니까 오늘도 Handler랑 놀아봐야지 ㅎㅎ



인터넷 예제의 설명에 의하면 (출처)


"별도 쓰레드로 실행하기 위해 Handler 객체를 생성합니다." 라고 한다.




이것을 이해하려면 우선 쓰레드(Thread)가 무엇인지 짚고 넘어가야할 것 같다.


    애플리케이션이 실행되면 시스템은 'main'이라고 불리는 Thread를 한 개 만든다. 이 스레드는 이벤트를 적절한 사용자 인터페이스 위젯에 디스패치(전달?)하는 역할을 한다. 이 Thread는 안드로이드 UI 툴킷(android.widget과 android.view 패키지)과 상호작용을 담당하기도 한다. 따라서 이 Thread는 UI Thread라고 불리기도 한다.

    시스템은 컴포넌트를 위해 별도로 Thread를 만들어서 돌리지는 않는다. 동일한 프로세스에서 돌아가는 모든 컴포넌트는 한 개의 UI Thread에서 객체화된다. 이는 시스템의 콜백 메소드들은 하나의 Thread에서 돌아간다는 걸 의미하기도 한다.(중략)

    화면에서 집중적으로 어떤 작업을 수행해야 하는 경우에는 단일 Thread 모델로는 성능이 떨어질 수 있다. 특히 UI Thread에서 모든 작업이 수행될 경우 네트워크 접속이나 데이터베이스 쿼리같은 오래 걸리는 작업을 수행할 경우 전체 UI가 Block된다. UI Thread가 Block되면 이벤트를 디스패치할 수도 없다. 사용자 이용 측면에서 보면 애플리케이션이 행에 걸리게 된다(오류가 발생한다?). 

    안드로이드 UI 툴킷은 Thread-safty하지 않다. 따라서 UI 프레임워크는 별도의 워커 Thread를 통해 UI를 조작하지 말아야한다. 반드시 UI Thread를 이용해 사용자 인터페이스를 조작해야한다. 안드로이드 Single Thread 모델에서는 다음 두가지 규칙을 지켜야한다.

(나홀로 개발자를 안드로이드 프로그래밍의 모든 것 / 김지훈, 이지훈, 이현우, 김도균 저 408p)


  1. UI Thread를 차단하지 말 것
  2. 외부의 UI Thread에서 안드로이드 UI 프레임워크에 접근하지 말 것


2번의 문제를 해결하기위해, 안드로이드에서는 다른 Thread에서 UI Thread로 접근할 수 있는 몇가지 방법을 제공한다.

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)


그래서 Handler가 뭔데?

    Handler는 안드로이드 프레임워크에서 제공하는 프로세스들 간의 메세지를 전달하기 위한 객체이다. 각 Handler는 Thread와 Message Queue로 구성된다. 새로운 Handler를 만들게되면 Handler에 Thread와 Message Queue가 바인딩되고 이때부터 메세지를 전달할 수 있다.
    주로 핸들러는 미래의 시점에 메세지를 전달하기 위해 사용된다.


'공부 > Android' 카테고리의 다른 글

[Android] 첫번째 삽질(부제:눈물의 ViewPager)  (0) 2017.03.31
[Android] Intro Activity 구현  (0) 2017.03.29
[Android] Inflate, Inflater  (0) 2017.03.28
[Android] ViewPager  (0) 2017.03.28
[Android] Logcat  (0) 2017.03.28