gpt4 book ai didi

android - Kotlin:每秒调用一个函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:19 25 4
gpt4 key购买 nike

我想为我的游戏创建一个简单的倒计时,当游戏开始时我希望每秒调用此函数:

fun minusOneSecond(){
if secondsLeft > 0{
secondsLeft -= 1
seconds_thegame.text = secondsLeft.toString()
}
}

我试过这个:

var secondsLeft = 15

timer.scheduleAtFixedRate(
object : TimerTask() {

override fun run() {
minusOneSecond()
}

},0, 1000
) // 1000 Millisecond = 1 second

但不幸的是应用停止了,第2次调用run函数

我 3 周前才开始接触 android 开发和 Kotlin,到目前为止我对它了解得最多。

在 Xcode 中使用 swift 我使用了这一行,我认为类似的东西也适用于 Kotlin

setTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(minusOneSecond), userInfo: nil, repeats: true)

最佳答案

问题: Timer 类使用带有队列的后台线程来排队并顺序执行所有任务。从您的代码中,因为您更新了 UI(更改 minusOneSecond 函数中的 TextView 内容)。这就是应用抛出以下异常并使您的应用崩溃的原因。

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

解决方案: 有很多方法可以完成您的任务,但我更喜欢使用 Handler 类中的 post()postDelayed() 方法.因为它简单易懂。

val mainHandler = Handler(Looper.getMainLooper())

mainHandler.post(object : Runnable {
override fun run() {
minusOneSecond()
mainHandler.postDelayed(this, 1000)
}
})

更新:来自作者关于如何从 Handler 暂停/恢复任务的评论。这是一个例子。

class MainActivityKt : AppCompatActivity() {

lateinit var mainHandler: Handler

private val updateTextTask = object : Runnable {
override fun run() {
minusOneSecond()
mainHandler.postDelayed(this, 1000)
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Your logic code
...
mainHandler = Handler(Looper.getMainLooper())
}

override fun onPause() {
super.onPause()
mainHandler.removeCallbacks(updateTextTask)
}

override fun onResume() {
super.onResume()
mainHandler.post(updateTextTask)
}

fun minusOneSecond() {
if secondsLeft > 0 {
secondsLeft -= 1
seconds_thegame.text = secondsLeft.toString()
}
}
}

关于android - Kotlin:每秒调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com