代码之家  ›  专栏  ›  技术社区  ›  Samrat

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

  •  6
  • Samrat  · 技术社区  · 7 年前

    我试图从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 回复  |  直到 7 年前
        1
  •  11
  •   Sachin Chandil    4 年前

    已更新

    协同程序现已稳定: https://kotlinlang.org/docs/reference/coroutines-overview.html


    旧答案

    是的,您可以使用 doAsync 来自kotlin anko库,非常简单易用。

    在模块级渐变文件中添加以下行:

    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 仅当您的活动或片段处于前台模式(支持生命周期)时才会执行。所以,如果您试图停止线程,因为您不想在活动处于后台时执行ui代码,那么这是一个理想的情况。

    如您所知 doAsync 返回未来对象,以便您可以通过以下方式取消后台任务 cancel() 功能:

    future.cancel(true)
    

    通过 true 如果要在线程开始执行时停止线程。

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

    您可以使用 科特林公司 同样,但仍处于实验阶段,您仍然可以尝试: https://kotlinlang.org/docs/reference/coroutines.html