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

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)

cha*_*l03 7

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

  • 尽管是实验性的,但协程仍处于生产就绪状态,如[此处]所述(/sf/ask/3236816551/)。我在Android项目中使用了它们,但从未遇到任何问题。我热烈建议在基于回调的API上使用它们。 (2认同)