λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Develop/Android

[Android] μ½”λ£¨ν‹΄μ΄λž€?

by bona.com 2024. 1. 23.

πŸ’‘λΈ”λ‘œκ·Έ 이동

μ›λž˜ Velog에 Android κ΄€λ ¨λœ 글을 μΌμ—ˆλŠ”λ° ν•˜λ‚˜λ‘œ ν†΅ν•©ν•˜λŠ” 게 쒋을 것 κ°™μ•„μ„œ Tistory에 ν†΅ν•©ν•˜λ €κ³  ν•©λ‹ˆλ‹€!

μ•„λž˜λŠ” λ§ν¬λŠ” λ³Έλ¬Έμž…λ‹ˆλ‹€.

 

[Android] μ½”λ£¨ν‹΄μ΄λž€?

코루틴 κ°œλ… λΏŒμ‹œκΈ°!πŸ‘Š

velog.io

 

ANR λ¬Έμ œλž€?

코루틴을 μ•Œμ•„λ³΄κΈ° 전에 ANR을 λ¨Όμ € μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.
ANR은 μ•‘ν‹°λΉ„ν‹°κ°€ μ‘λ‹΅ν•˜μ§€ μ•ŠλŠ” 였λ₯˜ 상황을 μ˜λ―Έν•œλ‹€. μ•‘ν‹°λΉ„ν‹°λ₯Ό μž‘μ„±ν•  λ•Œ ANR을 κ³ λ €ν•˜μ§€ μ•ŠμœΌλ©΄ 앱이 μˆ˜μ‹œλ‘œ μ’…λ£Œλ  수 μžˆλ‹€.

 

μ•‘ν‹°λΉ„ν‹°κ°€ μ‚¬μš©μž μ΄λ²€νŠΈμ— 5초 이내에 λ°˜μ‘ν•˜μ§€ μ•ŠμœΌλ©΄ ANR 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μ‹œμŠ€ν…œμ—μ„œ μ•‘ν‹°λΉ„ν‹°λ₯Ό μ‹€ν–‰ν•˜λŠ” μˆ˜ν–‰ 흐름을 λ©”인 μŠ€λ ˆλ“œ λ˜λŠ” 화면을 좜λ ₯ν•˜λŠ” μˆ˜ν–‰ νλ¦„μ΄λΌλŠ” μ˜λ―Έμ—μ„œ UI μŠ€λ ˆλ“œλΌκ³  ν•œλ‹€.

 

ANR 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 μ•‘ν‹°λΉ„ν‹°λ₯Ό μ‹€ν–‰ν•œ 메인 μŠ€λ ˆλ“œ 이외에 μ‹€ν–‰ 흐름을 λ”°λ‘œ λ§Œλ“€μ–΄μ„œ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ λ‹΄λ‹Ήν•˜κ²Œ ν•˜λ©΄ λœλ‹€.

 

 

그런데 이 λ°©λ²•μœΌλ‘œ λŒ€μ²˜ν•˜λ©΄ ANR 였λ₯˜λŠ” ν•΄κ²°λ˜μ§€λ§Œ 화면을 λ³€κ²½ν•  수 μ—†λ‹€λŠ” λ‹€λ₯Έ λ¬Έμ œκ°€ μƒκΈ°κ²Œ λœλ‹€.
μ™œλƒν•˜λ©΄ κ°œλ°œμžκ°€ λ§Œλ“  μŠ€λ ˆλ“œμ—μ„œλŠ” ν™”λ©΄ 변경을 ν•  수 μ—†κ³ , μ•‘ν‹°λΉ„ν‹°λ₯Ό 좜λ ₯ν•œ 메인 μŠ€λ ˆλ“œμ—μ„œλ§Œ ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

 

코루틴(Coroutione)μ΄λž€?

μ•‘ν‹°λΉ„ν‹°μ˜ ANR 였λ₯˜λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œ 코루틴이 μžˆλ‹€.

 

코루틴은 μΌμ’…μ˜ κ²½λŸ‰ μŠ€λ ˆλ“œλ‘œ, μ—¬λŸ¬ 개의 코루틴이 μ•„λ‹ˆλΌ μŠ€λ ˆλ“œμ—μ„œ λ™μž‘ν•  수 μžˆλŠ” κΈ°λŠ₯이닀.

 

비동기 κ²½λŸ‰ μŠ€λ ˆλ“œλΌκ³  μš”μ•½ν•  수 μžˆλ‹€.

 

μ½”λ£¨ν‹΄μ˜ μž₯점은 λ‹€μŒκ³Ό κ°™λ‹€.

  • κ²½λŸ‰μ΄λ‹€. (단일 μŠ€λ ˆλ“œμ—μ„œ λ§Žμ€ 코루틴을 μ‹€ν–‰ν•  수 μžˆλ‹€.)
  • λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ 적닀. (μŠ€μ½”ν”„ λ‚΄μ—μ„œ 코루틴이 μ‹€ν–‰λ¨μœΌλ‘œμ¨ μ•‘ν‹°λΉ„ν‹° λ˜λŠ” ν”„λž˜κ·Έλ¨ΌνŠΈμ˜ 생λͺ…주기에 따라 μ†Œλ©Έλ  λ•Œ κ΄€λ ¨ 코루틴을 ν•œλ²ˆμ— μ·¨μ†Œν•  수 있기 λ•Œλ¬Έ)
  • μ·¨μ†Œ λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.
  • λ§Žμ€ 제트팩 λΌμ΄λΈŒλŸ¬λ¦¬μ— μ μš©λ˜μ–΄ μžˆλ‹€.

Android ν”„λ‘œμ νŠΈμ—μ„œ 코루틴을 μ‚¬μš©ν•˜λ €λ©΄ μ•±μ˜ build.gradle νŒŒμΌμ— λ‹€μŒ 쒅속 ν•­λͺ©μ„ μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

 

ν™”λ©΄μ—μ„œ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μ•„λž˜μ˜ μ½”λ“œμ²˜λŸΌ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄ μ§„ν–‰λœ ν›„ 결괏값이 λ²„νŠΌ μ•„λž˜μ˜ ν…μŠ€νŠΈ 뷰에 좜λ ₯λ˜λŠ” 예λ₯Ό 가지고 μ„€λͺ…해보도둝 ν•˜κ² λ‹€.

val channel = Channel<Int>()
val backgroundScope = CoroutineScope(Dispatchers.Default + Job())
backgroundScope.launch {
	var sum = 0L
    var time = measureTimeMillis {
    	for (i in 1..2_000_000_000) {
        	sum += i
           }
       }
       Log.d("leee", "time : $time")
       channel.send(sum.toInt())
   }
   val mainScope = GlobalScope.launch(Dispatchers.Main) {
       channel.consumeEach {
           binding.resultView.text = "sum : $it"
       }
   }

 

μœ„μ—μ„œλŠ” backgroundScope와 mainScopeλ₯Ό λ§Œλ“€μ—ˆλ‹€. μ—¬κΈ°μ„œ μ£Όλͺ©ν•  점은 μŠ€μ½”ν”„λ₯Ό λ§Œλ“€λ©΄μ„œ μ§€μ •ν•œ λ””μŠ€νŒ¨μ²˜μ΄λ‹€. λ””μŠ€νŒ¨μ²˜λŠ” 이 μŠ€μ½”ν”„μ—μ„œ 코루틴이 μ–΄λ””μ—μ„œ λ™μž‘ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

  • Dispatchers.Main: μ•‘ν‹°λΉ„ν‹°μ˜ 메인 μŠ€λ ˆλ“œμ—μ„œ λ™μž‘ν•˜λŠ” 코루틴을 λ§Œλ“ λ‹€.
  • Dispatchers.IO: νŒŒμΌμ— μ½κ±°λ‚˜ μ“°κΈ° λ˜λŠ” λ„€νŠΈμ›Œν¬ μž‘μ—… 등에 μ΅œμ ν™”λ˜μ—ˆλ‹€.
  • Dispatchers.Default: CPUλ₯Ό 많이 μ‚¬μš©ν•˜λŠ” μž‘μ—…μ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•œλ‹€.

즉, μœ„μ˜ μ½”λ“œλŠ” μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ Dispatchers.Default둜 μ§€μ •ν•œ μŠ€μ½”ν”„μ—μ„œ κ΅¬λ™ν•œ 코루틴이 μ²˜λ¦¬ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό Dispatchers.Main으둜 μ§€μ •ν•œ μŠ€μ½”ν”„μ˜ μ½”λ£¨ν‹΄μ—μ„œ 화면에 좜λ ₯ν•˜λ„λ‘ μž‘μ„±ν•œ 것이닀.

λ˜ν•œ μœ„μ—μ„œλŠ” Channel을 μ΄μš©ν–ˆλŠ”λ° 이 ν΄λž˜μŠ€λŠ” μ½”λ£¨ν‹΄μ˜ 값을 전달받을 수 μžˆλŠ” 방법을 μ œκ³΅ν•œλ‹€.