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

时间:2018-02-06 05:24:23

标签: multithreading kotlin runnable

我试图从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()

1 个答案:

答案 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