在Kotlin中穿线的正确方法

时间:2019-04-06 10:01:09

标签: android multithreading kotlin

我有线程代码块,该代码块基本上显示进度条2秒钟,然后显示回收者视图。我想知道是否有更适当的方式编写此代码,例如协程或rxjava。我尝试了协程,但崩溃了。 代码:

 runOnUiThread {
            fabClose()
            isOpen = false
            rec_view.adapter=null
            progressBar.visibility = View.VISIBLE

        }
        val handler = Handler()
        val t = Timer()
        t.schedule(object: TimerTask() {
            override fun run() {
                handler.post {
                        runOnUiThread {
                            imageRecognition()
                            progressBar.visibility = View.GONE

                        }
                }
            }
        }, 2000)

2 个答案:

答案 0 :(得分:1)

虽然您可以使用协程,但您尝试实现的目标似乎很简单,只是您的代码看起来比所需的要复杂得多。

您可以尝试使用在主循环程序(位于主线程中的循环程序)上调用的postDelayed()的{​​{1}}方法:

Handler

答案 1 :(得分:1)

是的,您可以尝试使用 Kotlin协同程序来编写代码段,如下所示:

GlobalScope.launch(Dispatchers.Main) { // We launch new coroutine with Main thread as dispatcher
    fabClose()
    isOpen = false
    rec_view.adapter=null
    progressBar.visibility = View.VISIBLE
    // Here delay is suspended function which stops further execution of thread without blocking it.
    delay(2000L) // We provide non-blocking delay for 2 second which suspends this coroutine execution
    imageRecognition()
    progressBar.visibility = View.GONE
}

在这里,GlobalScope用于通过主线程创建我们的lauch协程 CoroutineContext (也可以使用async,两者之间的区别是它们提供的返回类型),并且我们将异步代码按顺序放置在Coroutine处理异步执行的位置。