π‘λΈλ‘κ·Έ μ΄λ
μλ 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μ μ΄μ©νλλ° μ΄ ν΄λμ€λ μ½λ£¨ν΄μ κ°μ μ λ¬λ°μ μ μλ λ°©λ²μ μ 곡νλ€.
'Develop > Android' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Android] μΉ΄μΉ΄μ€ μμ λ‘κ·ΈμΈ κ΅¬ννκΈ° (Kakao SDK) (0) | 2024.07.06 |
---|---|
[Android] λ©ν° λͺ¨λλ‘ νλ‘μ νΈ μ΄κΈ°μΈν νκΈ° (VersionCatalog, KSP) (0) | 2024.07.01 |
[Android] Nullable, NonNull, Kotlin scope function (1) | 2024.01.23 |
[Android] μν€ν μ² ν¨ν΄ (2) | 2024.01.23 |
[Android] μ½λ£¨ν΄κ³Ό Channel (0) | 2024.01.23 |