[Android][Toast] Can't toast on a thread that has not called Looper.prepare()
Crashlyticsμμ μ΄μ ν΄λΉ λ°κ²¬
λ§μ΄λ μ΄μλ‘ λ±μ₯νκ³ μλ€. (κ³ νλ¨νκ³ μλ€. μ λ° λ§μ΄λ μ΄μμ¬λΌ...)
μ΄μμ λν μ€λͺ λ€
https://stackoverflow.com/a/3875204
Can't create handler inside thread that has not called Looper.prepare()
What does the following exception mean; how can I fix it? This is the code: Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT); This is the exception: java.lang.RuntimeExce...
stackoverflow.com
https://gdlseed.tistory.com/70
μλλ‘μ΄λ μ½νλ¦° / can't toast on a thread that has not called looper.prepare()
Toast λ₯Ό μ¬μ©νλ€κ° can't toast on a thread that has not called looper.prepare() μλ¬κ° λμ€λ©΄μ App λΉμ μ μ’ λ£λ€ λμλ€. ꡬκΈλ§ νλλ UI μ€λ λκ° μλ μ€λ λμμ ν μ€νΈ μ°½μ λμ°λ €κ³ ν΄μ λ°μν λ¬Έ
gdlseed.tistory.com
μ¦, Toast νΈμΆμ UI μμ μ΄λΌ Main Threadμμ μμ ν΄μΌ νλλ°, μ€μ λ‘ Main Threadκ° μλ μ°λ λμμ Toast νΈμΆμ΄ μΌμ΄λ κ².
κ·ΈλΌ μ½λμ μ΄λμ, μ λ°μνλκ°
RetrofitService.INSTANCE.getMyApi()
.observeOn(Scheduler.io())
.subscribeOn(Scheduler.io())
.subscribe(data -> handleData(data),
error -> if (error != null) {
ExceptionExtensionsKt.handleErrorIfMyCustomException(error);
}
);
μλ°λ‘ μμ±λ μ½λμ΄λ€.
μλ¬ κ³΅ν΅ μ²λ¦¬ λ©μλ(μ λΆλΆμμ ν μ€ν νΈμΆνλ€.) νΈμΆμ΄ Main Threadμμ μ΄λ€μ§λ κ²μ΄ μλ κ²μ μ΄μ νμΈνλ€.
μ μλ¬ κ³΅ν΅ μ²λ¦¬ λΆλΆμ Main Threadμμ νΈμΆλλ κ²½μ°κ° λ λ§κΈ°λ νλ€.
μ΄μλ₯Ό μ΄λ»κ² μμ ν κ²μΈκ°
λ€μκ³Ό κ°μ λ°©λ²λ€μ΄ μλ€.
1. μ μλ¬ κ³΅ν΅ μ²λ¦¬ λ©μλλ₯Ό νΈμΆνλ λͺ¨λ κ³³μ λ€μ Έμ Main Threadμμ μ€ννλλ‘ μμ νλ€.
μ΄λ κ² μ§νν κ²½μ° μμλλ κ²λ€
- μκ³ λ‘λ€.
- μμ ν΄μΌν λΆλΆμ λ΄κ° λμΉ μ μλ€. κ²°κ΅μ λ κ°μ λ¬Έμ κ° λ°μν κ²μ΄λ€.
- μ μλ¬ κ³΅ν΅ μ²λ¦¬ λ©μλμ ν μ€νΈ νΈμΆμ΄ μλ€λ κ±Έ μΈμνμ§ λͺ»ν (νμ€ν 리λ₯Ό μμ΄λ²λ¦° λ―Έλμ λλ₯Ό ν¬ν¨ν΄μ) λ€λ₯Έ κ°λ°μκ° μ λ©μλλ₯Ό μ¬μ¬μ©μ Main Threadκ° μλ κ³³μμ νΈμΆνλλ‘ μ½λλ₯Ό μμ±ν μ μλ€. κ·ΈλΌ λ μ΄μκ° λ°μνλ€.
2. μ μλ¬ κ³΅ν΅ μ²λ¦¬ λ©μλ μμμ ν μ€νΈλ₯Ό νΈμΆνλ λΆλΆμ Main Threadμμ μ€ννλλ‘ μμ νλ€.
μ΄λ κ² μ§νν κ²½μ° μμλλ κ²λ€
- 1λ²λ³΄λ€λ ν¨μ¬ λ μκ³ λ‘λ€.
- μ λ©μλλ₯Ό μ¬μ¬μ©νλ κ²½μ° μ½λλ₯Ό μμ±νλ κ°λ°μλ μμ νλ Threadμ λν΄μ μ κ²½μΈ νμκ° μλ€.
2λ²μΌλ‘ μ ννλ€.
μ΄μ μμ
μλ¬ κ³΅ν΅ μ²λ¦¬ μ½λ μμ κΉλ³΄κ³ λμ κ³Όκ±°μ λ΄κ° λμΉ λΆλΆμ λ°κ²¬νλ€.π€¦βοΈ
μλ¬ κ³΅ν΅ μ²λ¦¬ μ½λ μμ μμ λ€μ΄ Main Threadμμ μμ ν΄μΌνλ κ²(ν μ€νΈ νΈμΆ λ±)κ³Ό Threadμμ μμ ν΄μΌνλ κ²(λ‘컬 λ°μ΄ν° μμ λ±)μΌλ‘ λλμ΄μ Έ μλλ°, μ½λ μμ± λΉμ μ΄κ²λ€μ κ³ λ €νμ§ μμλ€. π€¦βοΈ
μ΄λ² μ΄μλ‘ λ΄κ° λμΉ λΆλΆμ λ°κ²¬ν΄μ λ€νμ΄λ€.
μ½λ μμ μ λλ΅ μ΄λ¬νλ€.
fun Throwable.handleErrorIfMyCustomException() {
...
Thread {
//UI
Handler(Looper.getMainLooper()).post {
Timber.d("Toast Thread - ${Thread.currentThread().name}")
CustomToast.makeTest(context, R.string.msg, Toast.LENGTH_SHORT).show()
}
//Thread
Timber.d("Logout Thread - ${Thread.currentThread().name}")
LocalDataManager.deleteLocalData()
}.start()
...
}
μ½νλ¦°μΌλ‘ μμ±ν μ½λμ΄λ€.
λ‘κ·Έλ‘ λμ νμΈ μλ£.