๊พธ์ค€ํ•จ์ด ์ง„๋ฆฌ๋‹ค!!

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ์˜ค๋Š˜์ด ๋˜๊ณ ํ”ˆ ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜ ๋ธ”๋กœ๊ทธ

Android 31

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ RecyclerView(๋ฆฌ์‹ธ์ดํด๋Ÿฌ ๋ทฐ)์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹ ์˜ค๋Š˜์€ RecyclerView์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. RecyclerView(๋ฆฌ์‹ธ์ดํด๋Ÿฌ ๋ทฐ)๋ž€? RecyclerView๋Š” ListView์ฒ˜๋Ÿผ ์ œํ•œ๋œ ํ™”๋ฉด(Window)์— ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์…‹์„ ๋ณด์—ฌ์ค„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ListView๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ View๋ฅผ ๊ณ„์† ์ƒˆ๋กœ ์ƒ์„ฑ ํ•˜์ง€๋งŒ RecyclerView๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ View๋ฅผ ๊ณ„์† '์žฌํ™œ์šฉ(Recycle)' ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ListView์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ ์œผ๋กœ ํšจ์œจ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RecyclerView.ViewHolder RecyclerView๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” View์˜ ViewHolder๋กœ View์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RecyclerViewAdapter๋ฅผ ํ†ตํ•ด ViewHol..

Android/Kotlin 2022.10.28

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ Fragment(ํ”„๋ž˜๊ทธ๋จผํŠธ)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹ ์˜ค๋Š˜์€ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋Œ€ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. Fragment(ํ”„๋ž˜๊ทธ๋จผํŠธ)๋ž€? ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ž์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ , ์ž์ฒด ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉฐ, ์•กํ‹ฐ๋น„ํ‹ฐ ์‹คํ–‰ ์ค‘์— ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ชจ๋“ˆ์‹ ์„น์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ์•กํ‹ฐ๋น„ํ‹ฐ์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "ํ•˜์œ„ ์•กํ‹ฐ๋น„ํ‹ฐ"์™€ ๊ฐ™์€ ๊ฐœ๋…). Fragment(ํ”„๋ž˜๊ทธ๋จผํŠธ)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ”„๋ž˜๊ทธ๋จผํŠธ๋„ ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์•กํ‹ฐ๋น„ํ‹ฐ์— ์ข…์†๋˜์–ด ์žˆ๋Š” ๋งŒํผ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ จ์ด ๊นŠ์Šต๋‹ˆ๋‹ค. ์œ„ ์‚ฌ์ง„์€ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ž˜๊ทธ๋จผํŠธ๋„ Create , Start , Pause , Stop , Destroy๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์กด์žฌํ•˜์ง€๋งŒ ํ”„๋ž˜๊ทธ๋จผํŠธ ๋‚ด๋ถ€ vie..

Android/Kotlin 2022.10.20

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ BroadcastReceiver(๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฆฌ์‹œ๋ฒ„)์— ๋Œ€ํ•˜์—ฌ

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹ ์˜ค๋Š˜์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„์— ๋Œ€ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. BroadcastReceiver(๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„)๋ž€? Android ๊ตฌ์„ฑ์š”์†Œ ๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์—ฌ๋Ÿฌ ๋Œ€์ƒ๋“ค์—๊ฒŒ ํ•œ๊บผ๋ฒˆ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์˜ 4๋Œ€ ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.( ๊ตฌ์„ฑ์š”์†Œ ๊ฐ„ ๋ฉ”์‹œ์ง€๋Š” Intent๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.) BroadcastReceiver ๋™์  ๋“ฑ๋ก๊ณผ ์ •์  ๋“ฑ๋ก ์ •์  ๋ฆฌ์‹œ๋ฒ„๋Š” ์•ฑ์ด ์ข…๋ฃŒ๊ฐ€ ๋œ ํ›„์—๋„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด ํ•ด๋‹น Intent์— ๋Œ€ํ•˜์—ฌ ์‚ฌ์ „์— ์„ธํŒ…ํ–ˆ๋˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ๋™์  ๋ฆฌ์‹œ๋ฒ„๋Š” ์•ฑ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ค‘์—๋งŒ ๋ฐฉ์†ก์„ ๋ฐ›์•„ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ฆฌ์‹œ๋ฒ„ ์ƒ์„ฑ ๋ฐฉ๋ฒ• class SilenceBroadcastRece..

Android/Kotlin 2022.10.19

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ Service(์„œ๋น„์Šค)์— ๋Œ€ํ•˜์—ฌ

์•ˆ๋…•ํ•˜์„ธ์š” ์˜ค๋Š˜์€ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ Service์— ๋Œ€ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. Service(์„œ๋น„์Šค)๋ž€? ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์ฆ‰, ํ™”๋ฉด์—์„œ๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ๋’ค์—์„œ ์ง€์†์ ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. โœ”๏ธ ์„œ๋น„์Šค๋Š” ๋กœ์ปฌ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์„œ๋น„์Šค( startService( ) )์™€ ์›๊ฒฉ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค( bindService( ) )๊ฐ€ ์กด์žฌ Service(์„œ๋น„์Šค)์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์œ„ ์ด๋ฏธ์ง€๋Š” ์„œ๋น„์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚˜๋Š” ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋„ Activity์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋กœ์ปฌ ์„œ๋น„์Šค์™€ ์›๊ฒฉ ์„œ๋น„์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Local์—์„œ ๋™์ž‘ํ•˜๋Š” ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ startService()๋กœ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ..

Android/Kotlin 2022.10.14

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ Activity(์•กํ‹ฐ๋น„ํ‹ฐ)์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ํ•จ์ˆ˜

- onCreate() ์ตœ์ดˆ๋กœ Activity๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ดˆ๊ธฐํ™” ๊ด€๋ จ ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.d(TAG , "MainActivity - onCreate") } - onStart() ์ตœ์ดˆ๋กœ Activity๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, onCreate() ๋‹ค์Œ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. onStop() -> onRestart() ๋‹ค์Œ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ๋ถ€ํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. override fun onStart() { su..

Android/Kotlin 2022.10.14

[Android] ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ๋ผ์ด๋ธŒ ํƒฌํ”Œ๋ฆฟ(Live Templates) ์‚ฌ์šฉ๋ฐฉ๋ฒ•

Live Templates ๋ผ์ด๋ธŒ ํ…œํ”Œ๋ฆฟ, ์ง์—ญํ•˜์ž๋ฉด ์‚ด์•„์žˆ๋Š” ํ˜•ํŒ(ํ…œํ”Œ๋ฆฟ)์œผ๋กœ ๊ธฐ๋Šฅ ์ƒ์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด, ํŠน์ • ์ถ•์•ฝํ˜• ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ์ž์ฃผ ์“ฐ๋Š” ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ์ƒ์šฉ๊ตฌ. ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ ํ…œํ”Œ๋ฆฟ ์ค‘์—์„œ๋„ ์œ ์šฉํ•œ ๊ฒƒ๋“ค์ด ๊ฝค ๋งŽ์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์‚ฌ์šฉ์ž ์ปค์Šคํ…€๋„ ๊ฐ€๋Šฅ) ์˜ค๋Š˜์€ ์ปค์Šคํ…€ ๋ผ์ด๋ธŒ ํƒฌํ”Œ๋ฆฟ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. preference๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋“ค์–ด๊ฐ€์ค€๋‹ค. 2. ์šฐ์ธก Add๋ฅผ ํด๋ฆญํ•˜์—ฌ Live Templates๋ฅผ ํด๋ฆญ ํ•ด์ค๋‹ˆ๋‹ค. 3. ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค.(์ฒ˜์Œ ์ž…๋ ฅํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ ํ•˜๋‹จ์— define์„ ํด๋ฆญํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ์„ ์ฒดํฌ ํ•ด์ค๋‹ˆ๋‹ค. ๊ธ€์“ด์ด๋Š” kotlin์„ ์‚ฌ์šฉํ•˜๊ธฐ์— kotlin์— ์ฒดํฌ ํ•จ) * $CLASS_N..

Android/Kotlin 2022.10.14

[Kotlin] ์ฝ”ํ‹€๋ฆฐ Coroutine์— ๋Œ€ํ•˜์—ฌ (3) - Coroutine Flow(ํ”Œ๋กœ์šฐ)

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ‘‹ ์˜ค๋Š˜์€ ์ฝ”๋ฃจํ‹ด ๊ด€๋ จ ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์œผ๋กœ ์ฝ”๋ฃจํ‹ด Flow์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. 1. Coroutine Flow๋ž€? Flow๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ๋‚ด๋ณด๋‚ด๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋˜๋Š” ์˜ˆ์™ธ๋กœ ์™„๋ฃŒ๋˜๋Š” ๋น„๋™๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค. Flow์—๋Š” ์ด 3๊ฐ€์ง€ ์—ญํ• ์ด ์กด์žฌํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Producer (์ƒ์‚ฐ์ž) ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ(flow)์„ ์ƒ์‚ฐํ•˜๋ฉฐ ์ฝ”๋ฃจํ‹ด์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒ์‚ฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์คŒ InterMediary(์ค‘๊ฐœ์ž) Producer๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” ๊ฐ๊ฐ์˜ ๊ฐ’์ด๋‚˜ ์ŠคํŠธ๋ฆผ ์ž์ฒด๋ฅผ ์ˆ˜์ •, ์‚ญ์ œ,๋ณ‘ํ•ฉ ๋“ฑ์˜ ์กฐ์ž‘ ์ž‘ ์—…์„ ์ˆ˜ํ–‰ consumer(์†Œ๋น„์ž , ๊ตฌ๋…์ž) ์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ํ•˜๋Š” ๊ณณ( Android์—์„œ๋Š” ์ฃผ๋กœ UI ์ž‘์—…) 2. Cold Flow์™€ Hot Flow Cold Flow๋Š” ์†Œ..

Tutorial/tutorial 2022.10.13

[Kotlin] Kotlin Property ๋’ท๋ฐ›์นจ ํ•„๋“œ(Backing Field)์˜ ์‚ฌ์šฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š” Backing Filed(๋’ท๋ฐ›์นจ ํ•„๋“œ)์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  Java์—์„œ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ Kotlin์—์„œ๋Š” Property(์†์„ฑ)์ด๋ผ๊ณ  ์นญํ•ฉ๋‹ˆ๋‹ค. Kotlin์—์„œ๋Š” ์„ ์–ธ ํ‚ค์›Œ๋“œ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, - val ์˜ ๊ฒฝ์šฐ : getter ๋งŒ ์กด์žฌ - var ์˜ ๊ฒฝ์šฐ : setter / getter ๋‘˜ ๋‹ค ์กด์žฌ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์€ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Backing Field๋Š” ์œ„ setter / getter๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์†์„ฑ๊ฐ’์„ ์ˆ˜์ • , ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์„ค๋ช… ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. class Person{ val name = "DEV yo" get() = field.uppercase(Locale.getDefaul..

Tutorial/tutorial 2022.09.21

[Java][Android] Android ViewTreeObserVer onGlobalLayoutListener ํ™œ์šฉํ•˜๊ธฐ

์˜ค๋Š˜๋„ ํšŒ์‚ฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌ ์ค‘ ์•ฑ์ด destory ๋˜์—ˆ์Œ์—๋„ porifler์—์„œ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ํ™•์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GC๋ฅผ ์•„๋ฌด๋ฆฌ ๋Œ๋ ค๋„ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ ๋˜์ง€ ์•Š์•„ ํ•ด๋‹น ๋ถ€๋ถ„์„ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ MainView์—์„œ ViewTressObeserver์— onGlobalLayoutListener๋ฅผ ๋“ฑ๋กํ•œ ๊ฒƒ์ด ํ•ด์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ๋กœ ์˜ค๋Š˜์€ ViewTreeObserver๊ฐ€ ๋ญ”์ง€ ๋˜ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ์™œ ViewTreeObserver์—์„œ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋Š”์ง€์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Ž ViewTreeObserver๋ž€ ๋ฌด์—‡์ธ๊ฐ€? A view tree observer is used to register listeners that can be notified of..

Android/Java 2022.08.24

[Java][Android] ์•ˆ๋“œ๋กœ์ด๋“œ InputMethodManager ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(leak) ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์˜ค๋Š˜์€ ํšŒ์‚ฌ์—์„œ ๊ทผ๋ฌด์ค‘์— ๋ฐœ๊ฒฌํ•œ InputMethodManager์— ๊ด€๋ จํ•œ Memory Leak์— ๋Œ€ํ•ด ํฌ์ŠคํŒ… ํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด์ ์œผ๋กœ ์•ฑ์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ Leak๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธ์ค‘ dumpsys ํ™•์ธ๊ฒฐ๊ณผ GC๊ฐ€ ๋Œ์•„๋„ Activites์™€ View๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ๊ฒฌ๋˜์–ด ์•ฝ 1๋‹ฌ ๋™์•ˆ ํ•ด๋งธ์Šต๋‹ˆ๋‹ค.. ํ˜„์žฌ ์ œ๊ฐ€ ๊ทผ๋ฌดํ•˜๋Š” ํšŒ์‚ฌ์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „์€ Android4.4(KitKat)๋กœ ๋งค์šฐ ์˜›๋‚  ๋ฒ„์ „์ด๋‹ค๋ณด๋‹ˆ Profiler๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด ๋” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜๊ฒƒ์ด๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. (๋ณ€๋ช… ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.) Profiler๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ดํ›„ ์ถ”๊ฐ€์ ์œผ๋กœ ํฌ์ŠคํŒ… ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Profiler ํ™•์ธ ๊ฒฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ Leak์ด 2๊ฑด ๋ฐœ์ƒ ํ•˜์˜€๊ณ ..

Android/Java 2022.07.13