Ich bin sehr verwirrt darüber, wie Exception-Behandlung mit Korotinen funktioniert.Kotlin Coroutine schluckt Ausnahme
Ich hatte gehofft, dass es möglich wäre, eine Kette von Aussetzungsfunktionen zu haben, die Ausnahmen wie synchronen Code zwischen sich übergeben würden. Wenn Retrofit beispielsweise eine IOException ausgelöst hat, könnte ich diese Ausnahme am Anfang der Kette von Suspend-Funktionen behandeln, beispielsweise in einem Presenter, um einem Benutzer einen Fehler anzuzeigen.
Ich machte dieses einfache Beispiel, um Korotinen auszuprobieren, aber wenn ich throw Exception
auskommentieren Sie den Code, nachdem die Ausnahme fehlschlägt, aber die Ausnahme stürzt die App nicht ab.
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()
}
}
Ich habe versucht, async
und CoroutineExceptionHandler
verwenden.
ich versucht hatte, 'async' mit' await' vor, aber es beschwert sich, dass 'Funktion Suspend await sollte nur von einem Koroutine aufgerufen werden oder eine andere aussetzen function.' jedoch alles in Einwickeln' runBlocking' arbeitet ohne Unterbrechung das asynchrone Ausführen des Codes. 'runBlocking' ist ein verwirrender Name, da ich erwartet habe, dass er blockiert, bis die Koroutinen abgeschlossen sind. In meinem Fall bedeutet das, dass wenn Sie schnell auf den Button geklickt haben, ich erwartet habe, dass Sie die Zahl in Sekunden statt schnell erhöhen würde. Ich werde dies als Antwort markieren, aber meinen festen Code in eine andere Antwort setzen. – TTransmit
Wenn ich genauer hinschaue, kann ich sehen, dass 'runBlocking' in diesem Fall den UI-Thread blockiert, was ich nicht möchte. Ich muss versuchen, einen Rückruf zu verwenden. – TTransmit
Die Verwendung der Kotlinx 'Continuation' hier gibt mir bisher nur hässliche Callback-Hölle. – TTransmit