본문 바로가기

android/Kotlin

[안드로이드] Handler 공식문서 공부

1. Handler

  • Handler는 특정 스레드의 MessageQueue와 관련된 Message 및 Runnable 객체를 전송하고 처리할 수 있도록 해줍니다.
  • 각 Handler 인스턴스는 하나의 스레드와 메시지 큐에 연결되어있습니다.
  • 새로운 Handler를 생성하면 그것은 Looper에 바인딩됩니다.
    • 바인딩 : Handler가 특정 Looper와 연결되어, 그 Looper의 메시지 큐를 통해서 작업을 처리하게 되는 것
  • 이 Handler는 메시지와 runnable을 해당 Looper의 메시지 큐에 전달하고, 그것들을 Looper의 스레드에서 실행시킵니다.
  • 주요 용도
    • 미래의 어떤 시점에 실행될 메시지 및 runnable을 예약하는 것
      • 메시지를 예약하는 것은 post(Runnable), postAtTime(java.lang.Runnable, long), postDelayed(Runnable, Object, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), sendMessageDelayed(Message, long) 메서드들을 통해 수행됩니다.
    • 자신이 아닌 다른 스레드에서 실행될 작업을 큐에 넣는 것
      • post 버전은 Runnable 객체를 메시지 큐에 넣어서, 그것이 수신되었을 때 호출되도록 할 수 있으며, sendMessage 버전은 데이터 번들을 담은 Message 객체를 큐에 넣어서, 그것이 Handler의 handleMessage(Message) 메서드에서 처리되도록 할 수 있습니다 (이를 위해서는 Handler의 서브클래스를 구현해야 합니다).
  • 메인 스레드
    • 메인 스레드의 메시지 큐는 액티비티, 브로드 캐스트 리시버 등과 같은 최상위 애플리케이션 객체와 이 객체가 생성하는 window를 관리하는 역할을 합니다.
    • 사용자의 커스텀 스레드를 생성할 수 있으며, Handler를 통해 메인 스레드와 통신할 수 있다.
    • UI와 같은 사용자에게 보여지는 작업은 메인 스레드에서 해야하기 때문이다.

 

 

2. Looper

  • 쓰레드를 위한 메시지 루프를 실행하기 위해 사용되는 클래스이다.
    • Message loop : Looper의 쓰레드의 메세지 큐를 실행시키는 것
  • 메인 쓰레드가 아닌 커스텀한 쓰레드는 Message loop를 직접 생성해야합니다.
  • Message loop를 생성하려면, 루프를 실행할 스레드 내에서 prepare()를 호출한 다음, loop()를 호출하여 루프가 중지될 때까지 메시지를 처리하도록 해야한다. loop()가 끝나면 quit() 함수를 호출하여 loop가 끝났음을 명시한다.
  • Message loop 와의 대부분의 상호작용은 Handler 클래스를 통해 이루어진다.
class LooperThread extends Thread {
       public Handler mHandler;
 
       public void run() {
           Looper.prepare();
 
           mHandler = new Handler(Looper.myLooper()) {
               public void handleMessage(Message msg) {
                   // process incoming messages here
               }
           };
 
           Looper.loop();
       }
   }

 

 

3. Handler 사용 방법

1. Handler.post()

val handler = Handler(Looper.getMainLooper())

Thread {
    // 백그라운드 작업 수행
    val result = "작업 완료"

    // UI 스레드에서 실행
    handler.post {
        textView.text = result
    }
}.start()

 

  • 백그라운드 스레드에서 메인 쓰레드로 작업을 전달한다.

2. View.post()

Thread {
    // 백그라운드 작업 수행
    val result = "작업 완료"

    // UI 스레드에서 실행
    textView.post {
        textView.text = result
    }
}.start()

 

  • View가 연결된 메인 쓰레드에서 코드를 실행한다.

3. Activity.runOnUiThread()

Thread {
    // 백그라운드 작업 수행
    val result = "작업 완료"

    // UI 스레드에서 실행
    runOnUiThread {
        textView.text = result
    }
}.start()

 

  • Activity의 runOnUiThread() 메서드를 사용하여 UI 스레드 작업을 실행할 수 있습니다.

4. AsyncTask

class MyAsyncTask(private val textView: TextView) : AsyncTask<Void, Void, String>() {
    override fun onPreExecute() {
        super.onPreExecute()
        // 작업 시작 전 UI 설정
        textView.text = "작업 시작"
    }

    override fun doInBackground(vararg params: Void?): String {
        // 백그라운드 작업 수행
        Thread.sleep(2000) // 예시로 2초 지연
        return "작업 완료"
    }

    override fun onPostExecute(result: String) {
        super.onPostExecute(result)
        // 결과를 UI에 반영
        textView.text = result
    }
}

// AsyncTask 실행
MyAsyncTask(textView).execute()
  • AsyncTask를 사용하여 백그라운드 작업을 수행하고 결과를 UI 스레드에 전달할 수 있습니다.

 

 

출처

https://developer.android.com/reference/android/os/Handler

 

Handler  |  API reference  |  Android Developers

 

developer.android.com

 

'android > Kotlin' 카테고리의 다른 글

[안드로이드] ViewGroup.LayoutParams  (0) 2025.05.27
[안드로이드] startActivity  (0) 2025.05.27
getImageMatrix()  (0) 2025.05.26