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

Without AsyncTask, running a thread in background and updating the UI Thread

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

已更新

协程现在稳定了,:https://kotlinlang.org/docs/reference/coroutines-overview.html


旧答案

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

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

因为你可以检查 doAsync returns 一个 Future 对象,所以你可以通过 cancel() 函数取消后台任务:

future.cancel(true)

如果你想在线程开始执行时停止线程,请传递 true

如果您有更特殊的情况来处理停止情况,那么您可以执行与示例中相同的操作。

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