【问题标题】:Without AsyncTask, running a thread in background and updating the UI Thread没有 AsyncTask,在后台运行线程并更新 UI 线程
【发布时间】:2026-02-14 13:35:01
【问题描述】:

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

【问题讨论】:

    标签: multithreading kotlin runnable


    【解决方案1】:

    更新

    协程现在稳定了,: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返回一个Future对象,这样你就可以取消后台任务,通过cancel()函数:

    future.cancel(true)
    

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

    如果您有更专业的案例来处理停止案例,那么您可以执行与示例相同的操作。

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

    【讨论】:

    • 我知道 doAsync 使用起来相当简单......好吧,所以 doAsync 在这里会比我写的当前线程逻辑更好??? ....这就是你的意思吗?...我当前的代码工作正常...但我不知道它是否正确/好方法...
    • 我已经更新了更多细节的答案,你会在那里找到这个问题的答案。
    • 虽然是实验性的,但协程处于生产就绪状态,如 here 所述。我在我的 Android 项目中使用它们并且从未遇到任何问题。我强烈建议在这个基于回调的 API 上使用它们。