【问题标题】:Do handlers postDelays not work with for loops I've tried several ways, but cant get it to work. Kotlin, android studios处理程序 postDelays 是否不适用于 for 循环我尝试了几种方法,但无法使其正常工作。 Kotlin,安卓工作室
【发布时间】:2021-11-11 00:41:38
【问题描述】:

请原谅我目前编程的不好方式,我对编程很陌生。

好吧,假设我做了一个简单的 dnd 骰子滚轮(因为我是)。我做到了,所以它会根据他们想要掷出的骰子数量和骰子的类型来掷出一堆随机数。然后它将它发送到一个文本视图,一次相信一个。我想添加一个短暂的延迟,所以我问了stackOverFlow,我相信有一个处理程序可以工作;但是,出于同样的原因,我首先需要延迟。它仅显示显示屏上滚动的最后一个数字,按钮按下之间现在有短暂的延迟。我想向用户显示每个数字一次滚动一个,每个数字之间有很短的延迟。

没有处理程序的代码示例:

else if (numTimesRolled.progress <= 4) {
                for (i in 0 until numTimesRolled.progress + 1){
                    randNum = Random.nextInt(1, diceIsComfirm)
                    resultsArray[i] = randNum.toString()
                    randNumDisplay.text = resultsArray[i]
                }
            randNumResultsDisplay.text = "Rolled ${resultsArray.joinToString(" ")}"
        }

输出:最后掷出的数字

我尝试使用处理程序的示例:

else if (numTimesRolled.progress <= 3) {
            for (i in 0 until numTimesRolled.progress + 1){
                randNum = Random.nextInt(1, diceIsComfirm)
                resultsArray[i] = randNum.toString()
                    var runResults = Runnable {
                        randNumDisplay.text = resultsArray[i]
                    }
                var delayResults = Handler()
                delayResults.postDelayed(runResults, 1000)
            }
            //for (i in 0 until numTimesRolled.progress + 1){

            //}
            randNumResultsDisplay.text = "Rolled ${resultsArray.joinToString(" ")}"
        }

/////////////////////////////////////// ///////////////////////////////////////// /

else if (numTimesRolled.progress <= 3) {
            for (i in 0 until numTimesRolled.progress + 1){
                randNum = Random.nextInt(1, diceIsComfirm)
                resultsArray[i] = randNum.toString()
            }
            for (i in 0 until numTimesRolled.progress + 1){
                var runResults = Runnable {
                    randNumDisplay.text = resultsArray[i]
                }
                var delayResults = Handler()
                delayResults.postDelayed(runResults, 1000)
            }
            randNumResultsDisplay.text = "Rolled ${resultsArray.joinToString(" ")}"
        }

输出:两者都正常运行,但每次按下按钮时滚动的最后一个数字都有延迟。

我尝试将整个 for 循环设为“可运行”,但这只是我在寻找解决方案时愚蠢的。

【问题讨论】:

    标签: loops android-studio kotlin delay handler


    【解决方案1】:

    PostDelay 不会等待一段时间。它向处理程序发送一条消息,指定它何时应该做某事。为了得到你想要的,每个 postDelay runnable 必须发布另一个 post delay。

    【讨论】:

    • 我明白了,你知道一种可以按照我的方式工作的方法吗?是不是一定要学习协程,还是有更简单的?
    • 最简单的方法? PostDelay 每条消息为 i*1000。这将发布 10 个 runnable,每个 runnable 都会以不同的延迟运行。你不需要学习协程来做到这一点,尽管它们提供了另一种简单的方法(让协程在主线程上运行,并让它在那里延迟 1000。延迟将休眠,允许其他代码运行主线程,所以它不会被阻塞)。
    • 哦,好吧,我认为“i * 1000”是有道理的(我必须这样做才能确定我是否理解),协程是向我建议的选项之一;然而,这对我来说有点太复杂了,因为我很新。感谢您的帮助和洞察力,非常感谢。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多