728x90
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
'Android' 카테고리의 다른 글
[안드로이드] Bundle (0) | 2020.10.22 |
---|---|
[안드로이드] Service에서 Activity의 UI 업데이트하기 (0) | 2020.10.21 |
[안드로이드] BroadcastReceiver (0) | 2020.10.21 |
[안드로이드] Context (0) | 2020.10.21 |
[안드로이드] 안드로이드 앱 성능 개선 (feat. 네이버 테크 콘서트) (0) | 2020.10.19 |
댓글