【问题标题】:Updating Android View with iteration?用迭代更新 Android 视图?
【发布时间】:2016-10-09 08:18:05
【问题描述】:

我是一名初级安卓开发者。 (大约一周前开始)

我试图做一些秒表应用,所以我有一个可以更新的 Textview 和几个按钮来启动/停止。

这是我最初的想法:

//showing only pseudocode of callback method
run() {
  while(true) {
  //do calculations
  //calling setText -> updating the view
  }
}

然后,我尝试了以下方法:

run() {
  //do calculations
  //calling setText -> updating the view
  handler.postDelayed(this, 0) //calling this same method recursively
}

第二种方法很有效。 我不明白为什么第一种方法不起作用。 我认为使用循环而不是递归会更有效。

当我点击开始按钮,程序锁定,不能按任何东西。 似乎它甚至没有进入循环,因为即使在第一次迭代时它也不会更新视图。我什至尝试在其中放置一个 Thread.sleep 以“减慢它”(我认为它可能对系统或其他东西来说太快了)但结果相同。

所以问题是,为什么 android 视图不喜欢迭代? 请注意,其余代码都是相同的,只需删除循环即可。

是否与在 UI 线程上运行有关?但是,为什么这样做的递归方式有效?

【问题讨论】:

    标签: java android loops recursion


    【解决方案1】:
    //showing only pseudocode of callback method
    run() {
      while(true) {
      //do calculations
      //calling setText -> updating the view
      }
    }
    

    在上面的代码 sn-p 中,您尝试在非 UI 线程中 setText() 显然根本不起作用,因为您只能在 UI 线程中触摸您的视图。

    在另一种方法中,您将该作业传递给您的处理程序,该处理程序正在修改 UI 线程中的视图,因此它可以工作。

    【讨论】:

    • 也许我遗漏了一些东西,但它们都在 UI 线程中运行。即使在第一个示例中,我也将作业传递给处理程序,只是不是递归的。我调用的开始按钮函数包含 handler.postDelayed(runnableThatContainsThatRunMethodIWrote, 0)。处理程序位于 UI 线程中。我在整个代码中唯一改变的是 run() 方法的内部,它是递归的而不是迭代的。
    • 在这种情况下,我对here 有一个答案。
    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2021-01-25
    • 1970-01-01
    • 2022-11-19
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多