๋ชฉ์ฐจ
- handler thread์ thread์ ์ฐจ์ด
//๋ฐ์ดํฐ ์์ง ๋ฐ ์ฃผ๊ธฐ ์ค์ ์ํ ํธ๋ค๋ฌ
private val handlerThread = HandlerThread("SensorDataCollectionThread").apply { start() }
private val handler = Handler(handlerThread.looper)
private val collectDataRunnable = object : Runnable {
override fun run() {
if (!isCollectingData) { //1์ด๋์ ๋ฐ์ดํฐ ์์ง ์์
isCollectingData = true
startSensorDataCollection()
handler.postDelayed({
//1์ด ํ ๋ฐ์ดํฐ ์์ง ์ค์ง ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
stopSensorDataCollection()
processCollectedData()
isCollectingData = false
handler.postDelayed(this, selectedInterval.toLong())
}, 1000)
}
}
}
๊ณต์๋ฌธ์
A Handler allows you to → ํธ๋ค๋ฌ๋
send and process Message and Runnable objects → ๋ฉ์์ง์ Runnable ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๊ณ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
associated with a thread's MessageQueue. → ์ค๋ ๋์ MessageQueue์ ๊ด๋ จ์๋
ํธ๋ค๋ฌ์ ์ฃผ์ ๊ธฐ๋ฅ
- ๋ฉ์์ง ์ ์ก
- Handler๋ฅผ ํตํด ๋ค๋ฅธ ์ค๋ ๋๋ก ๋ฉ์์ง๋ ์คํํ ์์ (Runnable)์ ๋ณด๋ผ ์ ์๋ค.
- ๋ฉ์์ง ์ฒ๋ฆฌ
- ๊ฐ ์ค๋ ๋๋ MessageQueue๋ผ๋ ๋๊ธฐ์ด์ ๊ฐ์ง๊ณ ์๋ค.
- Handler๋ ์ด ๋๊ธฐ์ด์ ์๋ ๋ฉ์์ง๋ ์์ ์ ์์๋๋ก ๊บผ๋ด์ ์ฒ๋ฆฌํ๋ค.
Each Handler instance is associated with a single thread and that thread's message queue
๊ฐ ์ค๋ ๋ ๊ฐ์ฒด๋ ํ๋์ ํน์ ์ค๋ ๋์ ๊ทธ ์ค๋ ๋์ ๋ฉ์์ง ํ์ ์ฐ๊ฒฐ๋๋ค.
์ค๋ ๋๊ฐ ์ฌ๋ฌด์ค
๋ฉ์์ง ํ๋ ์ฌ๋ฌด์ค์ ํ ์ผ ๋ชฉ๋ก
ํธ๋ค๋ฌ๋ ์ด ์ฌ๋ฌด์ค์ ๋น์
When you create a new Handler it is bound to a Looper. It will deliver messages and runnables to that Looper's message queue and execute them on that Looper's thread.
์๋ก์ด ํธ๋ค๋ฌ๋ฅผ ์์ฑํ ๋ ๊ทธ ํธ๋ค๋ฌ๋ ํน์ looper์ ์ฐ๊ฒฐ๋๋ค.
์ด ํธ๋ค๋ฌ๋ ๋ฉ์์ง์ ์คํ๊ฐ๋ฅํ ์์ ์ธ Runnable ๊ฐ์ฒด๋ฅผ ํด๋น looper์ ๋ฉ์์ง ํ์ ์ ๋ฌํ๊ณ
๊ทธ looper๊ฐ ์ํ ์ค๋ ๋์์ ์ด๋ฅผ ์คํํ๋ค.
looper : ํ์ ๋ชฉ๋ง
handler : ํ์ ๋ชฉ๋ง์ ๋ง(๋ฉ์์ง๋ ์์ )์ ์ถ๊ฐํ๋ ์ฌ๋
๋ฉ์์ง ํ : ํ์ ๋ชฉ๋ง ์์ ๋ง๋ค
looper๊ฐ ์ํ ์ค๋ ๋๋ ํ์ ๋ชฉ๋ง๋ฅผ ๋๋ฆฌ๋ ๋๋ ฅ
Handler์ ์ฃผ์ ์ฉ๋
- ๋ฏธ๋์ ํน์ ์์ ์ ๋ฉ์์ง์ ์คํ ๊ฐ๋ฅํ ์์
(Runnable)์ ์์ฝ
- ์๋์๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋น์ทํจ!!!
- 3์ด ํ์ ์ด ์์ ์ ์คํํด๋ผ๊ณ ํธ๋ค๋ฌ์๊ฒ ์ง์ ๊ฐ๋ฅ
- ๋งค 5๋ถ๋ง๋ค ์ด ์์
์ ๋ฐ๋ณตํด๋ผ๊ณ ์ค์ ํ ์๋ ์์
- ์ผ์ ์๊ฐ ํ ํ๋ฉด ์ ๋
- ์ฃผ๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์๋ก๊ณ ์นจ
- ์ง์ฐ๋ ์ ๋๋ฉ์ด์ ์คํ
- ๋ค๋ฅธ ์ค๋ ๋์์ ์์
์ ์ํํ๋๋ก ๋๊ธฐ์ด์ ๋ฃ๊ธฐ
- ๋ค๋ฅธ ๋ถ์์ ์ ๋ฌด๋ฅผ ์์ฒญํ๋ ๊ฒ๊ณผ ๋น์ท!!
- ๋คํธ์ํฌ ์์ ํ UI ์ ๋ฐ์ดํธ
Handler์์ ๋ฉ์์ง๋ฅผ ์์ฝํ๋ ๋ฐฉ๋ฒ
- Post ๊ณ์ด ๋ฉ์๋ : Runnable ๊ฐ์ฒด ์ฌ์ฉ
- post(Runnable)
- postAtTime(Runnable,long)
- postDelayed(Runnable, Object, long)
handler.post {println("์ฆ์ ์คํ") }
handler.postDelayed( {println("3์ด ํ ์คํ")}, 3000 )
- sendMessage ๊ณ์ด ๋ฉ์๋ : Message ๊ฐ์ฒด ์ฌ์ฉ
- sendEmptyMessage(int)
- sendMessage(Message)
- sendMessageAtTime(Message,long)
- Message๋ ๋ฐ์ดํฐ ๋ฒ๋ค์ ํฌํจํ ์ ์์ด ๋ ๋ณต์กํ ์ ๋ณด ์ ๋ฌ์ ์ ์ฉํจ
val msg = Message.obtain()
msg.what = 1 // ๋ฉ์์ง ์๋ณ
msg.obj = "some data" // ์ ๋ฌํ ๋ฐ์ดํฐ
handler.sendMessage(msg)
Runnable๊ณผ Message ์ฐจ์ด
- Runnable : ์คํํ ์ฝ๋๋ฅผ ์ง์ ์ ์
- Message : ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ Handler์ handlerMessage ๋ฉ์๋์์ ์ฒ๋ฆฌ
์ฌ์ฉ ๋ฐฉ์
- post : ๊ฐ๋จํ ์์ ์ ์ ํฉ
- sendMessage : ๋ณต์กํ ๋ฐ์ดํฐ ์ ๋ฌ์ด ํ์ํ ๋ ์ฌ์ฉ
๊ตฌํ ๋ฐฉ์
- post : ๋ณ๋์ handler ์๋ธ ํด๋์ค๊ฐ ํ์ ์๋ค
- sendMessage : handler๋ฅผ ์์๋ฐ์ handlerMessage() ๋ฉ์๋๋ฅผ ๊ตฌํ
// sendMessage ์ฌ์ฉ
class MyHandler : Handler() {
override fun handleMessage(msg:Message) {
when(msg.what) {
1 -> println("๋ฉ์์ง 1 ๋ฐ์ : ${msg.obj}")
2 -> println("๋ฉ์์ง 2 ๋ฐ์}")
}
}
}
val handler = MyHandler()
handler.sendEmptyMessage(2)
Handler๋ฅผ ์ฌ์ฉํด ์์ ์ ์์ฝํ ๋ ์ฒ๋ฆฌ ์์ ์ ํ๊ธฐ
- ์ฆ์ ์ฒ๋ฆฌ
- ๋ฉ์์ง ํ๊ฐ ์ค๋น๋๋ ๋๋ก ๋ฐ๋ก ์ฒ๋ฆฌ
- handler.post { } ๋๋ handler.sendMessage(msg)
- ์ง์ฐ ์ฒ๋ฆฌ
- ์ง์ ๋ ์๊ฐ์ด ์ง๋ ํ์ ์ฒ๋ฆฌํ๋ค.
- handler.postDelayed( { } , 1000 ) → 1์ด ํ์ ์คํ
// 5์ด ํ ํ์ ์์ ์ฒ๋ฆฌ handler.postDelayed( { if(!isTaskCompleted) { println("์์ ํ์์์!") } },5000)
// ์ฃผ๊ธฐ์ ์ธ ์์ val tickRunnable = object : Runnable { override fun run() { println("ํฑ!") handler.postDelayed(this,1000) // 1์ด๋ง๋ค ๋ฐ๋ณต } } handler.post(tickRunnable)
- ์ ๋ ์๊ฐ ์ง์
- ์ ํํ ์๊ฐ์ ์ง์ ํ์ฌ ๊ทธ ์์ ์ ์ฒ๋ฆฌ
- handler.postAtTime( { }, SystemClock.uptimeMillis() + 5000 ) // ํ์ฌ๋ก๋ถํฐ 5์ด ํ ์คํ
val futureTime = SystemClock.uptimeMillis() + 10000 // 10์ด ํ์ ์๊ฐ handler.postAtTime( {println("์ ํํ 10์ด๊ฐ ์ง๋ฌ์ต๋๋ค") }, futureTime)
์๋๋ก์ด๋ ์ฑ์ ํ๋ก์ธ์ค์ ์ค๋ ๋ ๊ตฌ์กฐ
- ๋ฉ์ธ ์ค๋ ๋(UI ์ค๋ ๋)
- ์ฑ์ด ์์๋ ๋ ์๋์ผ๋ก ์์ฑ
- ์ฃผ์ ์ญํ
- ๋ฉ์์ง ํ ๊ด๋ฆฌ
- ์ฃผ์ ์ฑ ๊ตฌ์ฑ์์(์กํฐ๋นํฐ, ๋ธ๋ก๋ ์บ์คํธ ๋ฆฌ์๋ฒ) ๊ด๋ฆฌ
- UI ๊ด๋ จ ์์ ์ฒ๋ฆฌ
- ์ฌ์ฉ์ ์ ์ ์ค๋ ๋
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ๋ ์ถ๊ฐ ์ค๋ ๋
- ์ฃผ๋ก ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ ์ฒ๋ฆฌ
- ์ ) ๋คํธ์ํฌ ํต์ , ํ์ผ ์ฒ๋ฆฌ
๋ฉ์ธ ์ค๋ ๋์ ์ฌ์ฉ์ ์ ์ ์ค๋ ๋ ๊ฐ์ ํต์
- Handler๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ์ค๋ ๋์์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ฉ์์ง๋ ์์ ์ ์ ๋ฌํ ์ ์๋ค.
- ๋ฐฉ๋ฒ : post ๋๋ sendMessage() ๋ฉ์๋๋ฅผ ์ฌ์ฉ
class MainActivity : AppCompatActivity() {
private val handler = Handler(Looper.getMainLooper())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Thread {
val result = performLongRunningTask()
handler.post{
updateUI(result)
}
}.start()
}
private fun performLongRunningTask(): String {
// ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์
์๋ฎฌ๋ ์ด์
Thread.sleep(2000)
return "์์
์๋ฃ!"
}
private fun updateUI(result: String) {
// UI ์
๋ฐ์ดํธ (๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋จ)
findViewById<TextView>(R.id.resultTextView).text = result
}
'๐ค2024 ์๋๋ก์ด๋ > โ๏ธ ํ๊ณ ์ธํด ๊ฐ๋ฐ ํ๋ก์ ํธ ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ์ ์ก ์๋ ๊ธฐ๋ก (0) | 2024.08.29 |
---|---|
Android : suspend function์ด๋? (1) | 2024.08.29 |
Android ๊ถํ ์์ฒญ ์ฒ๋ฆฌํ๊ธฐ (๋ฐํ์ ๊ถํ??) (0) | 2024.08.23 |
Android Thread (0) | 2024.08.19 |
๐ ํ๋ก์ ํธ ์๋ฃ ํ 4L ํ๊ณ (0) | 2024.08.19 |