Sam*_*rai 1 multithreading runnable kotlin
我正在尝试从Kotlin中的后台线程更新回收者视图的内容。我没有使用AsyncTask。
这是我的代码,我想知道是否有比这更好的方法:
在我的MainActivity中,我将progressThread作为成员变量。
var progressThread = Thread()
Run Code Online (Sandbox Code Playgroud)
然后在我想首先运行线程的方法中,我正在定义它...就像
progressThread = Thread (
Runnable {
kotlin.run {
try {
while (i <= 100 && !progressThread.isInterrupted) {
Thread.sleep(200)
//Some Logic
runOnUiThread {
//this runs in ui thread
}
i++
}
}catch (e:InterruptedException){
progressThread.interrupt()
}
}
})
Run Code Online (Sandbox Code Playgroud)
之后,我将以与
progressThread.start()
Run Code Online (Sandbox Code Playgroud)
为了停止它,我有一个监听器来取消进度,并且在该监听器的回调中,我写了:
progressThread.interrupt()
Run Code Online (Sandbox Code Playgroud)
是的,您可以使用doAsynckotlin anko库来完成此操作,该库非常简单易用。
在模块级gradle文件中添加以下行:
compile "org.jetbrains.anko:anko-commons:0.10.0"
Run Code Online (Sandbox Code Playgroud)
代码示例:
val future = doAsync {
// do your background thread task
result = someTask()
uiThread {
// use result here if you want to update ui
updateUI(result)
}
}
Run Code Online (Sandbox Code Playgroud)
uiThread仅当您的“活动”或“片段”处于前台模式(具有生命周期意识)时,才会执行写入的代码块。因此,如果您由于不想在Activity处于后台时执行ui代码而试图停止线程,那么这对您来说是一个理想的情况。
您可以检查doAsync返回Future对象,从而可以按cancel()功能取消后台任务:
future.cancel(true)
Run Code Online (Sandbox Code Playgroud)
传递true如果你想甚至停止线时,它已经开始执行。
如果您有更专业的案例来处理终止案例,则可以执行与示例中相同的操作。
您还可以在实验阶段使用Kotlin Coroutines,但仍然可以尝试:https : //kotlinlang.org/docs/reference/coroutines.html
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |