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

7

我正在尝试在Kotlin的后台线程中更新recycler视图内容。我没有使用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个回答

12

更新

协程现在已经稳定: 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处于前台模式(它具有生命周期感知能力)时才会执行。因此,如果您试图停止线程,因为您不希望在Activity在后台时执行您的UI代码,那么这是一个理想情况。

正如您可以检查的那样,doAsync返回一个Future对象,因此您可以通过cancel()函数取消后台任务:

future.cancel(true)

如果您希望即使线程已开始执行也停止线程,请将true传递给此参数。

如果您有更专业的情况需要处理停止,则可以像示例中那样执行相同的操作。

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


我明白doAsync使用起来相当简单...好的,那么在这里使用doAsync会比我写的当前线程逻辑更好?...你是这个意思吗?我的当前代码运行良好...但我不知道它是否是正确/好的方式... - Samrat
我已经更新了答案并添加了更多细节,您将在那里找到这个问题的答案。 - Sachin Chandil
2
尽管是实验性的,但协程已经处于生产就绪状态,如此解释在这里。我在我的Android项目中使用它们,从未遇到任何问题。我强烈建议使用它们而不是基于回调的API。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接