【问题标题】:Using android kotlin - problem with random number display + delay使用android kotlin - 随机数显示+延迟问题
【发布时间】:2020-03-16 04:19:59
【问题描述】:

我在 Android Studio 中使用 kotlin。 我正在编写一个简单的程序来显示一个系列 随机数之间的延迟为 1 秒 每一个。 RandNumText 是屏幕上的名称 盒子。我尝试了以下方法:-

i = 1
while (i < 10) {
    RandNumText.text = ((0..9).random()).toString()
    for (j in 0 until 50000) {}
    i++
}

i = 1
while (i < 10) {
    RandNumText.text = ((0..9).random()).toString()
    Thread.sleep(1000)  // wait for 1 second
    i++
}

i = 1
val handler = Handler()
while (i<10) {
    handler.postDelayed({RandNumText.text = ((0 until 10).random()).toString()}, 1000)
    i++
}

每次只有一个数字出现在屏幕上。 我究竟做错了什么?您的协助将 受到赞赏。谢谢。

【问题讨论】:

    标签: android kotlin random delay


    【解决方案1】:

    第一个立即更改数字 10 次,因为没有延迟。计数到 50000 只会浪费一点 CPU 并使函数花费更长的时间,但由于它在主线程中调用,因此在函数返回之前您不会看到 UI 的任何更新。 (另外,数到 50000 应该不到 1-2 毫秒,当然这不是一种准确的计时方法。)

    第二个也在主线程上进行所有更改,因此您不会看到任何 UI 更改,因为函数不会在更改之间返回。此外,它阻塞了主线程,因此可以触发 ANR。

    第三个创建了十个延迟动作,这些动作在一秒钟后全部更改,因此更改同时发生。您可以更新它以错开这样的延迟:

    for (i in 0 until 10) {
        handler.postDelayed({RandNumText.text = ((0 until 10).random()).toString()}, 1000 * (i + 1))
    }
    

    但是请注意,这些传递给 Handler 的可运行对象会捕获封闭的 Activity 或 Fragment,因此如果用户离开,它们将导致上下文泄漏。处理程序应该存储在成员属性中,您应该在onDestroy() 中调用removeCallbacks()

    如果您希望这种情况无限期地继续下去,您可以创建一个可自行发布的 Runnable:

    val runnable = object: Runnable {
            override fun run() {
                RandNumText.text = ((0 until 10).random()).toString()
                handler.postDelayed(this, 1000)
            }
        }
    handler.postDelayed(runnable, 1000)
    

    【讨论】:

      【解决方案2】:

      我认为问题可能在于您每次都在生成新数字并覆盖现有文本。 试试这样的:

      RandNumText.text = RandNumText.text + (0..9).random().toString()
      

      【讨论】:

        【解决方案3】:

        非常感谢您提供这些非常有用的信息。下面的代码确实会生成一系列 0 到 9 范围内的随机数并连续运行。然而,尽管大部分时间延迟似乎相当均匀,但出于某种原因偶尔会出现较长的暂停。

        enter code hereval handler = Handler() enter code hereval 可运行 = 对象:可运行 { enter code here覆盖有趣的运行(){ enter code here RandNumText.text = ((0..9).random()).toString() enter code here handler.postDelayed(this, 1000) enter code here } enter code here}

        enter code herehandler.postDelayed(runnable, 1000)


        此版本显示 0 到 9 范围内的 10 个随机数,但每个数字之间的延迟非常不均匀,然后将最后一个留在屏幕上。

        enter code hereval handler = Handler() enter code hereval 可运行 = 对象:可运行 { enter code here override fun run() {

        enter code here for (i in 0 .. 9) { enter code here RandNumText.text = ((0 .. 9).random()).toString() enter code here handler.postDelayed(this, 1000) enter code here } enter code here } enter code here}

        enter code herehandler.postDelayed(runnable, 1000)

        我正在继续尝试其他方法。我不知道像统一延迟这样简单的问题在android kotlin中很难实现。再次感谢您的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-23
          • 1970-01-01
          • 2018-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          相关资源
          最近更新 更多