【发布时间】:2019-04-30 12:33:33
【问题描述】:
我很高兴我将长时间运行的任务切换为 UI 线程 到 协程。与 Android 中的 AsyncTask 或常规线程相比,它提高了性能并将内存使用量减少了 3 倍,并且所有内存泄漏都消失了。
唯一的问题是,在异常在某个时间发生...
之后,我不知道应该如何重新启动长时间运行的操作阅读大量文章后,我觉得我根本不了解协程中的异常处理。让我知道如何实现所需的行为。
- 我在片段中有协程范围(将在不久的将来移动到 VM)。
lateinit var initEngineJob: Job
override val coroutineContext: CoroutineContext
get() = initEngineJob + Dispatchers.Main
- 使用 async/await 长时间运行的任务。
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
}
我不知道我应该把try catch放在哪里。我试图用 try catch 包围 deferred.await(),但我可以不能在 catch 块中调用相同的方法来重试长时间运行的任务。我尝试了 SupervisorJob(),但也没有成功。我仍然无法再次调用 initWorkEngineCoroutine() 并 启动新的协程...
帮助终于解决了这个问题:)
【问题讨论】:
-
你从来没有给
initEngineJob分配任何东西,你也没有使用coroutineContext——你的样本不完整吗? -
我在 onCreate 中分配 initiEngineJob。如果我在 Fragment 中使用 coroutineContext 是否已经被覆盖? Android Studio 显示它选择了正确的 coroutineContext
标签: android kotlin android-memory kotlin-coroutines