Notice
Recent Posts
Recent Comments
Link
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐ŸŒฑ dreaming DiNO

[Android] ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž˜ ๋‹ค๋ฃจ๊ธฐ Thread, Looper, Handler ๋ณธ๋ฌธ

Android

[Android] ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž˜ ๋‹ค๋ฃจ๊ธฐ Thread, Looper, Handler

MK_____ 2022. 12. 28. 16:21

์•ˆ๋“œ๋กœ์ด๋“œ UI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ, ์ด ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๊ธด ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋ถ„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ UI ์Šค๋ ˆ๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹  ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


์†Œ๊ฐœ

์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฌ๋ ค ํ”„๋กœ์„ธ์Šค๋กœ ๋งŒ๋“ค๋ฉฐ, ์ด ๋•Œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์ฃผ์š” ์ปดํผ๋„ŒํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ณณ์ด์ž UI๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ ๊ฐฑ์‹ ํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ UI ์Šค๋ ˆ๋“œ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ทฐ๋‚˜ ๋ทฐ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ๋‹ด๋‹นํ•˜๋Š” ์›์น™์„ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ๊ทœ์น™์€ ์ฒซ์งธ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ(UI ์Šค๋ ˆ๋“œ)๋ฅผ ๋ธ”๋Ÿญํ•˜์ง€ ๋ง ๊ฒƒ, ๋‘˜์งธ, ์•ˆ๋“œ๋กœ์ด๋“œ UI ํˆดํ‚ท์€ ์˜ค์ง UI ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ, ์ด ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ์˜ํ–ฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๊ณ , ๊ธ‰๊ธฐ์•ผ ์‚ฌ์šฉ์ž์˜ ๋ถˆํŽธํ•จ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ์‹œ์Šคํ…œ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ANR(Appication Not Responding) ์ƒํƒœ๋กœ ์ „ํ™˜์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—ฌ๋ถ„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด Looper์™€ Handler๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” Java์˜ Thread๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ž˜ํ•‘ํ•œ HandlerThread, ๋” ๋‚˜์•„๊ฐ€ Thread๋‚˜ Message Loop ๋“ฑ์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ํฌ๊ฒŒ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ AsyncTask ๋“ฑ์˜ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋จผ์ € Thread-Looper-Handler์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ , ๋‚˜์•„๊ฐ€ HandlerThread์™€ AsyncTask์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฐœ๋ฐœ ๋‰ด์Šค๋ฅผ ๋” ๋งŒ๋‚˜๋ณด์„ธ์š”

๊ตฌ๋…ํ•˜๊ธฐ
 
Comments 

Looper์™€ Handler์˜ ์‚ฌ์šฉ ๋ชฉ์ 

์™œ ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ UI ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œํ• ๊นŒ์š”? ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๋•Œ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํ…์ŠคํŠธ๋ทฐ์— setText()๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‘˜ ์ค‘ ์–ด๋А ์Šค๋ ˆ๋“œ์˜ setText()๊ฐ€ ์ ์šฉ๋ ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ณ , ์‚ฌ์šฉ์ž๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด ๋‹ค๋ฅธ ํ•œ ์Šค๋ ˆ๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค. ์ด๊ฐ™์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋™๊ธฐํ™” ์ด์Šˆ๋ฅผ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ Looper์™€ Handler๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Looper์™€ Handler์˜ ์ž‘๋™ ์›๋ฆฌ

๋จผ์ € ์Šค๋ ˆ๋“œ์™€ Looper, Handler๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Looper๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ทธ ์•ˆ์—๋Š” Message Queue๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Message Queue๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋‚˜ ํ˜น์€ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ Message๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ์ž…์„ ์ถœ ํ˜•์‹์œผ๋กœ ๋ณด๊ด€ํ•˜๋Š” Queue์ž…๋‹ˆ๋‹ค. Looper๋Š” Message Queue์—์„œ Message๋‚˜ Runnable ๊ฐ์ฒด๋ฅผ ์ฐจ๋ก€๋กœ ๊บผ๋‚ด Handler๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Handler๋Š” Looper๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ Message๋ฅผ ์‹คํ–‰, ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„์„œ Message Queue์— ๋„ฃ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹  ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์ด์ œ Handler์™€ Looper, Message Queue์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Handler

Handler๋Š” ์Šค๋ ˆ๋“œ์˜ Message Queue์™€ ์—ฐ๊ณ„ํ•˜์—ฌ Message๋‚˜ Runnable ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Handler ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์™€, ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ Message Queue์— ์ข…์†๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ Handler ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ๊ฒฝ์šฐ ์ด๋ฅผ ๋งŒ๋“  ์Šค๋ ˆ๋“œ์™€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ Message Queue์— ๋ฐ”์ธ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ํŠน์ • ์Šค๋ ˆ๋“œ์— ์†ํ•œ Handler์˜ post๋‚˜ sendMessage ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ Message Queue๋Š” ์ „๋‹ฌ๋ฐ›์€ Message๋ฅผ ์„ ์ž…์„ ์ถœ ํ˜•์‹์œผ๋กœ ๋ณด๊ด€ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์ „๋‹ฌ ์‹œ์ ์— ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Queue์˜ ๋งจ ์œ„๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜, ์›ํ•˜๋Š” ๋งŒํผ Message๋‚˜ Runnable ๊ฐ์ฒด์˜ ์ „์†ก์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ์“ฐ์ด๋Š” Handler์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์•„๋ž˜ ํ‘œ์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํ„ด๊ฐ’๋ฉ”์„œ๋“œ๋ช…์ธ์ž์„ค๋ช…
void handleMessage Message msg Looper๊ฐ€ Message Queue์—์„œ ๊บผ๋‚ด์ค€ Message๋‚˜ Runnable ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌ
(์ƒ์† ์‹œ ๊ตฌํ˜„ ํ•„์ˆ˜)
final boolean post Runnable r Message Queue์— Runnable r์„ ์ „๋‹ฌ
final boolean sendMessage Message msg Message Queue์— Message msg๋ฅผ ์ „๋‹ฌ
final boolean postAtFrontOfQueue Runnable r Message Queue์˜ ๋งจ ์•ž์— Runnable r์„ ์ „๋‹ฌ
final boolean sendMessageAtFrontOfQueue Message msg Message Queue์˜ ๋งจ ์•ž์— Message msg๋ฅผ ์ „๋‹ฌ
final boolean postDelayed Runnable r, long delayMillis delayMillis๋งŒํผ ์ง€์—ฐ ํ›„ Message Queue์— Runnable r์„ ์ „๋‹ฌ
final boolean sendMessageDelayed Message msg, long delayMillis delayMillis๋งŒํผ ์ง€์—ฐ ํ›„ Message Queue์— Message msg๋ฅผ ์ „๋‹ฌ

์™ธ๋ถ€, ํ˜น์€ ์ž๊ธฐ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ง€๋Š” handleMessage() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ •ํ•ฉ๋‹ˆ๋‹ค. sendMessage()๋‚˜ post()๋กœ ํŠน์ • Handler์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ์žฌ๊ท€์ ์ธ ํ˜ธ์ถœ๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋”œ๋ ˆ์ด๋ฅผ ์ด์šฉํ•œ ํƒ€์ด๋จธ๋‚˜ ์Šค์ผ€์ค„๋ง ์—ญํ• ๋„ ํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Looper์™€ Message Queue

Looper๋Š” ๋ฌดํ•œํžˆ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ์ž์‹ ์ด ์†ํ•œ ์Šค๋ ˆ๋“œ์˜ Message Queue์— ๋“ค์–ด์˜จ Message๋‚˜ Runnable ๊ฐ์ฒด๋ฅผ ์ฐจ๋ก€๋กœ ๊บผ๋‚ด์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  Handler์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” Looper๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋ผ ์žˆ์ง€๋งŒ, ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์Šค๋ ˆ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Looper๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ณ , ๋‹จ์ง€ run ๋ฉ”์„œ๋“œ๋งŒ ์‹คํ–‰ํ•œ ํ›„ ์ข…๋ฃŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ ค๋ฉด prepare() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Looper๋ฅผ ์ƒ์„ฑํ•˜๊ณ , loop() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Looper๊ฐ€ ๋ฌดํ•œํžˆ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ Message Queue์— ์Œ“์ธ Message๋‚˜ Runnable ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด Handler์— ์ „๋‹ฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ™œ์„ฑํ™”๋œ Looper๋Š” quit()์ด๋‚˜ quitSafely() ๋ฉ”์„œ๋“œ๋กœ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. quit() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด Looper๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๊ณ , quitSafely() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜„์žฌ Message Queue์— ์Œ“์ธ ๋ฉ”์‹œ์ง€๋“ค์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Message์™€ Runnable

Message๋ž€ ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ํ•  ๋‚ด์šฉ์„ ๋‹ด๋Š” ๊ฐ์ฒด์ด์ž Queue์— ๋“ค์–ด๊ฐˆ ์ผ๊ฐ์˜ ๋‹จ์œ„๋กœ Handler๋ฅผ ํ†ตํ•ด ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Message๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์ƒˆ Message ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์‹œ์Šคํ…œ์— ๋งŒ๋“ค์–ด ๋‘” Message Pool์˜ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. obtain() ๋ฉ”์„œ๋“œ๋Š” ๋นˆ Message ๊ฐ์ฒด๋ฅผ, obtain(Handler h, int what …)์€ ๋ชฉ์  handler์™€ ๋‹ค๋ฅธ ์ธ์ž๋“ค์„ ๋‹ด์€ Message ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. Runnable์„ ์„ค๋ช…ํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” Thread() ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“ค์–ด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ run()์„ ๊ตฌํ˜„ํ•˜๋˜์ง€, Thread(Runnable runnable) ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“ค์–ด์„œ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋˜์ง€ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ›„์ž์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Runnable๋กœ ์Šค๋ ˆ๋“œ์˜ run() ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋Š” run() ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋Š” run()์ฝ”๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ Message๊ฐ€ int๋‚˜ Object๊ฐ™์ด ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ํ•  ๋‚ด์šฉ์„ ๋‹ด๋Š”๋‹ค๋ฉด, Runnable์€ ์‹คํ–‰ํ•  run() ๋ฉ”์„œ๋“œ์™€ ๊ทธ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ๋‹ด๋Š”๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

HandlerThread

Looper์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์Šค๋ ˆ๋“œ๋Š” Java์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋„์ž…ํ•œ Looper๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ™์€ ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•  ๋•Œ Looper๋ฅผ ์ž๋™์œผ๋กœ ๋ณด์œ ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ HandlerThread์ž…๋‹ˆ๋‹ค. HandlerThread๋Š” ์ผ๋ฐ˜์ ์ธ ์Šค๋ ˆ๋“œ๋ฅผ ํ™•์žฅํ•œ ํด๋ž˜์Šค๋กœ ๋‚ด๋ถ€์— ๋ฐ˜๋ณตํ•ด์„œ ๋ฃจํ”„๋ฅผ ๋„๋Š” Looper๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ Looper ๋‚ด๋ถ€์˜ Message Queue๋„ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ด๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ๋กœ Message๋‚˜ Runnable์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AsyncTask

AsyncTask๋Š” ์Šค๋ ˆ๋“œ๋‚˜ ๋ฉ”์‹œ์ง€ ๋ฃจํ”„ ๋“ฑ์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๋ชฐ๋ผ๋„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ UI์ž‘์—…๊ณผ backgrond ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์บก์Аํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์‹œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ฆ๋Œ€๋˜๋Š” ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ, ํƒœ์Šคํฌ ์Šค์ผ€์ฅด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ์‰ฝ๊ฒŒ UI ๊ฐฑ์‹ ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ž‘์—… ์ทจ์†Œ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์ŠคํŠธ์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ๋“ฑ UI์™€ ๊ด€๋ จ๋œ ๋…๋ฆฝ๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ AsyncTask๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ: AsyncTask์˜ ๊ตฌ์กฐ

๊ทธ๋Ÿฌ๋‚˜ AsyncTask๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šค์ผ€์ค„๋ง ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์ˆ˜์˜ ์ œํ•œ์ด ์žˆ๊ณ , ๋ช‡ ์ดˆ ์ •๋„์˜ ์งง์€ ์ž‘์—…์—์„œ๋งŒ ์ด์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๋ฒ„์ „ ๋ณ„๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋™์ž‘์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํ—ˆ๋‹ˆ์ฝค ์ดํ›„ ๋ฒ„์ „์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๋ณ‘๋ ฌ์ ์ธ ๋™์ž‘์„ ์›ํ•œ๋‹ค๋ฉด AsyncTask๋ฅผ ์‹คํ–‰ํ•  ๋•Œ AsyncTask.THREAD_POOL_EXECUTOR ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ ์•ž์„œ ์‚ดํŽด๋ณธ Handler์™€ Looper๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ž‘๋™ ์›๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฉฐ ๊ตฌํ˜„์„ ์ง์ ‘ ํ•ด์•ผ ํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ์„œ ๊ฐ€๋…์„ฑ์„ ์ €ํ•ดํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ๊ทธ๋งŒํผ ๊ฐœ๋ฐœ ๋ฒ”์œ„๊ฐ€ ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ UI ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ž‘์—…ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๋ณด๋‹ค ๋งŽ์€ ์ž์œจ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด Handler๋‚˜ HandlerThread ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

๋„์›€๋œ ์‚ฌ์ดํŠธ

์ œ๋ชฉ์— ๋งํฌ๋œ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ๋ฅผ ์ •๋…ํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ๋…์„ ์ •๋ฐ€ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐ–์—๋„ ๋‹ค์Œ ์‚ฌ์ดํŠธ๋“ค์ด ํฌ๊ฒŒ ๋„์›€๋์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : https://academy.realm.io/kr/posts/android-thread-looper-handler/