![](/img/trans.png)
[英]Android Kotlin "withTimeout" coroutine how to handle exception
[英]Kotlin coroutine swallows exception
关于异常处理如何与协同程序一起使用,我感到非常困惑。
我希望有一个挂起函数链可以像同步代码一样在它们之间传递异常。 因此,如果说Retrofit抛出IOException,我可以在挂起函数链的开头处理该异常,例如在演示者中向用户显示错误。
我做了这个简单的例子来尝试协同程序但是如果我取消注释要么在Exception无法运行之后throw Exception
调用代码但是异常不会使应用程序崩溃。
package com.example.myapplication
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.TextView
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val text = findViewById<TextView>(R.id.thing_text)
val button = findViewById<Button>(R.id.thing_button)
var count = 0
button.setOnClickListener {
launch {
count++
// throw Exception("Boom")
val string = delayedStringOfInt(count)
runOnUiThread { text.text = string }
}
}
}
suspend fun delayedStringOfInt(int: Int): String {
delay(1000)
// throw Exception("Boom")
return int.toString()
}
}
我尝试过使用async
和CoroutineExceptionHandler
。
使用async
,您应该在某处await
结果,这样您就不会丢失任何异常。
这是根据Alexey Romanov的答案捕获异常的代码。 通过更多的工作,我已经开始使用它了。 添加Log.d("thread", Thread.currentThread().name)
表明延迟不会阻止UI。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val text = findViewById<TextView>(R.id.thing_text)
val button = findViewById<Button>(R.id.thing_button)
var count = 0
button.setOnClickListener {
launch {
val job = async {
count++
val string = delayedStringOfInt(count)
updateTextView(text, string)
}
try {
job.await()
} catch (e: IOException) {
makeToastFromException(e)
}
}
}
}
fun makeToastFromException(e: Exception) {
runOnUiThread {
Toast.makeText(this@MainActivity, e.localizedMessage, Toast.LENGTH_SHORT).show()
}
}
fun updateTextView(text: TextView, string: String) {
runOnUiThread { text.text = string }
}
suspend fun delayedStringOfInt(int: Int): String {
delay(2000)
if (int % 4 == 0) throw IOException("Boom")
return int.toString()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.