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本身。我该如何解决这个问题?
答案 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的向后兼容性,我可以亲自证明其实施的稳健性 - 我从来没有遇到任何问题。
您提到您担心还需要暂停进度监视器,然后再将其恢复。使用协同程序,您可以按如下方式实现:
在showLoadingProgress()
内你会写
suspendCoroutine { cont -> this.progressMonitorContinuation = cont }
这意味着存在var progressMonitorContinuation: Continuation<Unit>?
。
当您准备好恢复进度监视器时,请写
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)
}
}