没有AsyncTask,在后台运行线程并更新UI线程

我试图从Kotlin的后台线程更新回收者视图内容。 我没有使用AsyncTask。

这里是我的代码,我想知道是否有比这更好的方法:

在我的MainActivity中,我有ProgressThread作为成员variables。

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() 

是的,你可以使用doAsync 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) } } 

uiThread写入的代码块只有在你的Activity或Fragment处于前台模式时才会执行(这是生命周期感知)。 所以如果你试图停止线程,因为你不希望你的UI代码在Activity处于后台时执行,那么这对你来说是一个理想的情况。

正如你可以检查doAsync返回一个Future对象,所以你可以通过cancel()函数取消后台任务:

 future.cancel(true) 

如果你想要停止线程,即使它已经开始执行,也是如此。

如果你有更专门的案件来处理停止案件,那么你可以做同样的事情,在你的例子。

您也可以使用Kotlin Coroutines,但在实验阶段,仍然可以尝试一下: https : //kotlinlang.org/docs/reference/coroutines.html