我试图从Kotlin的后台线程更新回收站视图内容。我没有使用AsyncTask。
这是我的代码,我想知道是否有更好的方法:
在我的MainActivity中,我将progressThread作为成员变量。
var progressThread = Thread()
然后在我想要运行线程的方法中我首先定义它...比如
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()
}
}
})
之后,我以与
相同的方法启动它 progressThread.start()
并且为了阻止它,我有一个监听器来取消进度,并且在那个监听器的回调中,我写道:
progressThread.interrupt()
答案 0 :(得分:2)
是的,您可以使用kotlin anko库中的doAsync
来完成此操作,该库非常简单易用。
在模块级gradle文件中添加以下行:
compile "org.jetbrains.anko:anko-commons:0.10.0"
代码示例:
val future = doAsync {
// do your background thread task
result = someTask()
uiThread {
// use result here if you want to update ui
updateUI(result)
}
}
只有当您的Activity或Fragment处于前台模式时才会执行 uiThread
中编写的代码块(它可识别生命周期)。因此,如果您因为不希望在活动处于后台时执行ui代码而试图停止线程,那么这对您来说是理想的情况。
您可以检查doAsync
返回一个Future对象,以便您可以通过cancel()
函数取消后台任务:
future.cancel(true)
如果要在线程开始执行时停止线程,则传递true
。
如果您有更专业的案例来处理停止案例,那么您可以执行与示例中相同的操作。
你也可以使用 Kotlin Coroutines ,但是在实验阶段,你仍然可以尝试一下:https://kotlinlang.org/docs/reference/coroutines.html