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의 서브클래스를 구현해야 합니다).
- 미래의 어떤 시점에 실행될 메시지 및 runnable을 예약하는 것
- 메인 스레드
- 메인 스레드의 메시지 큐는 액티비티, 브로드 캐스트 리시버 등과 같은 최상위 애플리케이션 객체와 이 객체가 생성하는 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 |