728x90
λ°μν
1. UI μ°¨λ¨(Block) νμμ μ리μ λ¬Έμ μ
- Androidμ μ€λ λ λͺ¨λΈ
- Android μ±μ κΈ°λ³Έμ μΌλ‘ λ©μΈ μ€λ λ(Main Thread)μμ μ¬μ©μ μΈν°νμ΄μ€(UI)μ κ΄λ ¨λ μμ
μ μνν©λλ€.
- μ: νλ©΄μ λ²νΌ νμ, μ¬μ©μμ ν΄λ¦ μ΄λ²€νΈ μ²λ¦¬.
- λ€νΈμν¬ μμ μ μ£Όλ‘ μ€λ 걸릴 μ μλ μμ μ μνλ©°, λ©μΈ μ€λ λμμ μ€ννλ©΄ λ€λ₯Έ μμ (νΉν UI κ΄λ ¨ μμ )μ΄ λκΈ° μνμ λ€μ΄κ°λλ€.
- Android μ±μ κΈ°λ³Έμ μΌλ‘ λ©μΈ μ€λ λ(Main Thread)μμ μ¬μ©μ μΈν°νμ΄μ€(UI)μ κ΄λ ¨λ μμ
μ μνν©λλ€.
- UI μ°¨λ¨(Blocking)μ μμΈ
- λ€νΈμν¬ μμ
μ λ°μ΄ν°λ₯Ό μ‘μμ νλ λμ μΈλΆ μλ²μμ ν΅μ μ κΈ°λ€λ €μΌ ν©λλ€.
- μ) μλ²μμ λ°μ΄ν°λ₯Ό μ²λ¦¬νκ±°λ, λ€νΈμν¬ μ§μ°(Latency)μ΄ λ°μνλ κ²½μ°.
- μ΄ λμ μ±μ κ²°κ³Όκ° λ°νλκΈ°λ₯Ό κΈ°λ€λ¦¬λ©° μ무κ²λ νμ§ λͺ»νλ μνκ° λ©λλ€.
- λ©μΈ μ€λ λκ° μ΄ λκΈ° μμ μ λ¬Άμ΄κ² λλ©΄ UI μ λ°μ΄νΈ(νλ©΄ 그리기, ν°μΉ μλ΅ λ±)κ° μ€λ¨λ©λλ€.
- λ€νΈμν¬ μμ
μ λ°μ΄ν°λ₯Ό μ‘μμ νλ λμ μΈλΆ μλ²μμ ν΅μ μ κΈ°λ€λ €μΌ ν©λλ€.
- μ¬μ©μκ° λλΌλ λ¬Έμ
- νλ©΄μ΄ λ©μΆ€ κ²μ²λΌ 보μ΄λ©°, μ±μ΄ "μλ΅νμ§ μμ"μΌλ‘ μΈμλ μ μμ΅λλ€.
- μ±μ λ€μκ³Ό κ°μ μ¦μμ λ³΄μΌ μ μμ΅λλ€:
- λ²νΌ ν΄λ¦ μ μλ¬΄λ° λ°μμ΄ μμ.
- νλ©΄μ ν μ€νΈλ μ΄λ―Έμ§λ₯Ό μλ‘κ³ μΉ¨νμ§ μμ.
- μ΄λ‘ μΈν΄ μ¬μ©μ κ²½ν(UX)μ΄ ν¬κ² μ νλ©λλ€.
- ANR(Application Not Responding)
- Androidλ λ©μΈ μ€λ λμμ μμ
μ΄ 5μ΄ μ΄μ μ°¨λ¨λλ©΄ ANR μ€λ₯λ₯Ό λ°μμν΅λλ€.
- ANR μ°½: "μ±μ΄ μλ΅νμ§ μμ΅λλ€. μ±μ μ’ λ£νμκ² μ΅λκΉ?" λΌλ λ©μμ§κ° νμλ¨.
- ANRμ μ¬μ©μκ° μ±μ μ’ λ£νκ² λ§λ€λ©°, μ± ννμ μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
- Androidλ λ©μΈ μ€λ λμμ μμ
μ΄ 5μ΄ μ΄μ μ°¨λ¨λλ©΄ ANR μ€λ₯λ₯Ό λ°μμν΅λλ€.
2. λ€νΈμν¬ μμ μμ λΉμ©κΈ° μμ μ νμμ±
- λΉλκΈ° μ²λ¦¬μ κ°λ
- λΉλκΈ° μμ μ λ€νΈμν¬ μμ²κ³Ό κ°μ κΈ΄ μμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬λ λμ , μμ μ λ°±κ·ΈλΌμ΄λμμ μ²λ¦¬νλ©° λ€λ₯Έ μμ μ κ³μ μ§νν©λλ€.
- μμ μλ£ ν κ²°κ³Όλ§ μ λ¬λ°μ UIλ₯Ό μ λ°μ΄νΈν©λλ€.
- λΉλκΈ° μμ
μ μ₯μ
- UI μλ΅μ± μ μ§:
- λ€νΈμν¬ μμ μ΄ μ§νλλ λμμλ UIλ μ μμ μΌλ‘ λμ.
- μ¬μ©μλ μ±μ΄ μ€λ¨λμ§ μκ³ "λ°μμ΄ λΉ λ₯΄λ€:"κ³ λλ.
- ν¨μ¨μ μΈ λ¦¬μμ€ μ¬μ©:
- λ©μΈ μ€λ λμμ μμ μ΄ μ€λ¨λμ§ μμΌλ―λ‘ CPUμ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ νμ©.
- μ€μ²©λ νΈμΆ κ΄λ¦¬:
- μ¬λ¬ λ€νΈμν¬ μμ μ λμμ μ²λ¦¬ν μ μμ΄ μμ ν¨μ¨μ΄ λμμ§.
- UI μλ΅μ± μ μ§:
3. μ½λ£¨ν΄μ μλ μ리μ κΈ°λ₯
1. κ²½λ μ€λ λ
- μ½λ£¨ν΄μ μ΄μ체μ μ μ€λ λ λμ , κ°λ²Όμ΄ ꡬ쑰체 ννλ‘ λμνμ¬ νλμ μ€λ λμμ μμ² κ°μ μ½λ£¨ν΄μ μ€ν κ°λ₯ν©λλ€.
- μ€λ λ ν(Thread Pool)μ μ§μ κ΄λ¦¬ν νμ μμ΄, νμν λ§νΌ λΉλκΈ° μμ μ μμ± κ°λ₯ν©λλ€.
2. μμ°¨μ μ΄λ©΄μ λΉλκΈ°μ μΈ μ½λ μμ±
- μ½λ£¨ν΄μ μ¬μ©νλ©΄ λ€νΈμν¬ νΈμΆμ λ§μΉ λκΈ° μμ μ²λΌ μμ°¨μ μΌλ‘ μμ±ν μ μμ΅λλ€.
- μλ μ½λλ λκΈ°μ μΌλ‘ 보μ΄μ§λ§, μ€μ λ‘λ λ€νΈμν¬ νΈμΆμ΄ λ°±κ·ΈλΌμ΄λμμ λΉλκΈ°λ‘ μ²λ¦¬λ©λλ€.
suspend fun fetchData() {
val data = apiService.getData() // λΉλκΈ° νΈμΆ
updateUI(data) // UI μ
λ°μ΄νΈ
}
3. Dispatchersμ νμ©
- Dispatchers.IO: λ€νΈμν¬ μμ κ³Ό κ°μ I/O μ§μ€ μμ μ μ΅μ ν.
- Dispatchers.Main: UIμ κ΄λ ¨λ μμ μ λ°λμ λ©μΈ μ€λ λμμ μ€ν.
- μ½λ£¨ν΄μ withContextλ₯Ό μ¬μ©νλ©΄ μμ νκ² μμ μ μ μ ν μ€λ λλ‘ μ ν κ°λ₯.
CoroutineScope(Dispatchers.IO).launch {
val result = fetchNetworkData()
withContext(Dispatchers.Main) {
textView.text = result
}
}
4. μ€λ₯ κ΄λ¦¬μ λ¨μν
- μ½λ£¨ν΄μμ λ€νΈμν¬ μμ μ μ€λ₯λ₯Ό μ²λ¦¬νκΈ° μν΄ try-catchλ₯Ό μ¬μ©.
- λ€νΈμν¬ νΈμΆ μ€ν¨λ μμΈ λ°μ μ UIμ μλ¬ λ©μμ§λ₯Ό μμ νκ² νμ κ°λ₯.
try {
val response = apiService.getData()
// μ±κ³΅ μ²λ¦¬
} catch (e: Exception) {
// μ€λ₯ μ²λ¦¬
}
4. μ½λ£¨ν΄ νμ© μμ λ€νΈμν¬ μμ νλ¦
- μμ
λΆλ¦¬
- λ©μΈ μ€λ λ: UI κ΄λ ¨ μμ λ° μ¬μ©μ μ λ ₯ μ²λ¦¬.
- I/O μ€λ λ: λ€νΈμν¬ μμ , λ°μ΄ν° μ²λ¦¬ λ± CPU λλ I/O μ§μ€ μμ .
- μμ
μλ£ ν UI μ
λ°μ΄νΈ
- λ€νΈμν¬ μμ μ΄ μλ£λλ©΄ Dispatchers.Mainλ‘ μ ννμ¬ μμ νκ² UIλ₯Ό κ°±μ .
- λ°±κ·ΈλΌμ΄λ μμ κ³Ό UI μμ κ°μ λͺ νν μν λΆλ΄μΌλ‘ μμ μ± ν보.
- λ€μ€ λ€νΈμν¬ νΈμΆ μ²λ¦¬
- μ¬λ¬ λ€νΈμν¬ μμ²μ λμμ μ€ννκ³ , κ²°κ³Όλ₯Ό μ‘°ν©νμ¬ μ²λ¦¬ κ°λ₯.
CoroutineScope(Dispatchers.IO).launch {
val data1 = async { fetchData1() }
val data2 = async { fetchData2() }
val combined = data1.await() + data2.await()
withContext(Dispatchers.Main) {
updateUI(combined)
}
}
μ 리νλ©΄
- λΉλκΈ° μμ μ΄ νμν μ΄μ λ λ€νΈμν¬ μμ μ νΉμ±κ³Ό Androidμ μ€λ λ μ μ± λλ¬Έμ λλ€. UIμ°¨λ¨μ μ¬μ©μκ° μ±μ λ리거λ λΆμμ νλ€κ³ μΈμνκ² λ§λ€λ©°, ANRλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- μ½λ£¨ν΄μ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ°±κ·ΈλΌμ΄λμμ μμ μ μ€ννλ©΄μλ, UI μ λ°μ΄νΈ μ λ©μΈ μ€λ λλ₯Ό μμ νκ² μ¬μ©ν μ μλ κ°λ ₯ν λꡬλ₯Ό μ 곡ν©λλ€.
- λ€νΈμν¬ μμ μμ μ½λ£¨ν΄μ νμ©νλ©΄ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ ν₯μλλ©°, μμ μ μ΄κ³ μλ΅μ± μ’μ μ±μ λ§λ€ μ μμ΅λλ€.
728x90
λ°μν