Я очень рад, что я переключил свои долгосрочные задачи, которые постоянно выдают результаты в поток пользовательского интерфейса на сопрограммы . Это улучшило производительность и уменьшило использование памяти в 3 раза, и все утечки памяти исчезли по сравнению с AsyncTask или обычными потоками в Android.
Единственная проблема остается в том, что я не знаю, как мне перезапустить мою длительную операцию после исключения в какое-то время ...
Мне кажется, я совсем не понял обработку исключений в сопрограммах после прочтения тонны статей. Дайте мне знать, как мне достичь желаемого поведения.
- У меня есть фрагмент сопрограммы во фрагменте (в ближайшее время я перейду к VM).
1017 *
lateinit var initEngineJob: Job
override val coroutineContext: CoroutineContext
get() = initEngineJob + Dispatchers.Main
& # x200B;
- Долгосрочное задание с асинхронным вызовом / ожиданием.
& # x200B;
fun initWorkEngineCoroutine()
{
launch {
while(true) {
val deferred = async(Dispatchers.Default) {
getResultsFromEngine()
}
val result = deferred.await()
if (result != null) {
//UI thread
draw!!.showResult(result)
}
}
}
}
fun getResultsFromEngine() :Result? {
result = // some results from native c++ engine, which throws exception at some times
return result
}
я не знаю, куда мне положить пробуй поймать. Я попытался окружить deferred.await () с помощью метода catch, но я не смог вызвать тот же метод в блоке catch , чтобы повторить долгосрочную задачу. Я пытался SupervisorJob (), но безуспешно. Я все еще не мог вызвать initWorkEngineCoroutine () снова и начать новую сопрограмму ...
Помогите окончательно решить эту проблему:)