在runnable中的handler.postDelayed显示Kotlin中的语法错误 - Android

时间:2018-02-23 06:54:02

标签: android kotlin task handler runnable

private val progressTask = Runnable {
    runOnUiThread { if (!tvMessage.text.isEmpty()) tvMessage.text = "" }
    pbLoading.progress++
    when {
        pbLoading.progress == 600 -> finalFunction()
        pbLoading.progress % 20 == 0 -> runOnUiThread {
            tvMessage.text = messages[pbLoading.progress / 20]
        }
    }
    handler.postDelayed(this, 1000)
}

此代码在this关键字下给出了语法错误。说这个错误指向我的活动而不是runnable本身。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

为了使this引用Runnable,请使用object语法而不是带SAM conversion的lambda:

val runnable = object : Runnable {
        override fun run() {
            println("$this runs in a runnable")
        }
}

稍微冗长一点,但这是你支付的价格。

答案 1 :(得分:2)

让我为您提供更深层次的问题解决方案:帮自己一个忙,转而使用Kotlin协程。这就是你的代码看起来的样子:

fun showLoadingProgress(tvMessage: TextView, pbLoading: ProgressBar) = launch(UI) {
    if (!tvMessage.text.isEmpty()) tvMessage.text = ""
    with(pbLoading) {
        do {
            delay(1000)
            if (progress++ % 20 == 0) tvMessage.text = messages[progress / 20]
        } while (progress < 600)
        finalFunction()
    }
}

如果您担心他们仍然是“实验性”,那么这只意味着他们的API尚未最终确定。 JetBrains已经committed保持与实验API的向后兼容性,我可以亲自证明其实施的稳健性 - 我从来没有遇到任何问题。

您提到您担心还需要暂停进度监视器,然后再将其恢复。使用协同程序,您可以按如下方式实现:

  1. showLoadingProgress()内你会写

    suspendCoroutine { cont -> this.progressMonitorContinuation = cont }
    

    这意味着存在var progressMonitorContinuation: Continuation<Unit>?

  2. 当您准备好恢复进度监视器时,请写

    val cont = this.progressMonitorContinuation!!
    this.progressMonitorContinuation = null
    launch(UI) { cont.resume(Unit) }
    

答案 2 :(得分:1)

  

此代码在this关键字

下给出了语法错误

首先,修改Kotlin中的runOnUiThread方法

private val progressTask = Runnable {
        activity!!.runOnUiThread(Runnable {
            Handler().postDelayed(Runnable {

                // YOUR CODE

            }, 1000)
        })
    }

答案 3 :(得分:0)

你在kotlin处理程序中使用如下代码

 private val progressTask = Runnable {
        runOnUiThread { if (!tvMessage.text.isEmpty()) tvMessage.text = "" }
        pbLoading.progress++
        when {
            pbLoading.progress == 600 -> finalFunction()
            pbLoading.progress % 20 == 0 -> runOnUiThread {
                tvMessage.text = messages[pbLoading.progress / 20]
            }
        }
        Handler().postDelayed(this, 1000)
    }

如果传递此关键字,则运行run()方法。

  override fun run() {
}

答案 4 :(得分:0)

使用以下代码:

//创建处理程序实例

private val handler = Handler()

private val progressTask = object : Runnable {
    override fun run() {
        println("$this runs in a runnable")

        runOnUiThread { if (!tvMessage.text.isEmpty()) tvMessage.text = "" }
        pbLoading.progress++
        when {
            pbLoading.progress == 600 -> finalFunction()
            pbLoading.progress % 20 == 0 -> runOnUiThread {
                tvMessage.text = messages[pbLoading.progress / 20]
            }
        }
        handler.postDelayed(this, 1000)
    }
}