본문 바로가기
Android

[안드로이드] Handler와 Looper

by Sky Titan 2020. 11. 4.
728x90
 

Handler  |  Android 개발자  |  Android Developers

 

developer.android.com

Handler

  • handler는 스레드끼리의 데이터 교환을 가능하게 해준다.
  • handler에 작업을 수신받을 스레드의 looper를 따로 지정하여서 다른 스레드에서 post(), sendMessage() 메서드를 사용해서 보낸 message 혹은 Runnable 객체를 수신 스레드에서 처리한다
  • 예를 들어, handler를 main스레드에서 생성 혹은 main스레드의 looper를 지정해놓고 작업 스레드에서 handler.post()로 UI 업데이트 작업을 할 수 있다.

 

Looper

  • looper는 handler가 보낸 message, runnable 객체를 보관하고 있는 스레드의 Message큐에서 작업들을 하나씩 꺼내서 handler에게 전달하는 역할을 한다.
  • Main 스레드는 기본적으로 Looper를 가지고 있고 실행 중이다.
  • 하지만 따로 생성한 자바 Thread는 Looper를 따로 생성해주어야 한다.
  • HandlerThread는 기본적으로 Looper를 가지고 있다. 

 

예제

  • 메인 스레드의 루퍼를 가진 handler를 생성
    • 루퍼를 가져오길 원하는 스레드에서 주생성자 Handler()를 호출하거나 직접 Handler(getLooper())를 통해 루퍼를 지정할 수도 있다.
  • 작업 스레드를 생성해서 메인스레드에 텍스트 뷰의 내용을 업데이트하는 Runnable 객체를 보내어 UI 업데이트 작업을 처리하도록 한다.
package org.techtown.test

import android.os.Bundle
import android.os.Handler
import android.os.HandlerThread
import androidx.appcompat.app.AppCompatActivity

import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.delay

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //메인 스레드의 핸들러 생성
        var handler = Handler() //or Handler(mainLooper)

        //작업 스레드 생성
        var thread = Thread("Worker")
        thread.run {

            //UI 업데이트 작업 진행
            handler.post {
                tv.setText("UI Update from ${this.name}")
            }
        }
        thread.start()
    }


}

728x90

댓글