【问题标题】:Handler postDelay() from background thread来自后台线程的处理程序 postDelay()
【发布时间】:2017-09-28 10:16:40
【问题描述】:

谁能看出这不起作用的任何原因?

 override fun resetAnimations() {
    Log.d("MainActivity", "start")
    Handler().postDelayed( { reset()}, 1500)
    Log.d("MainActivity", "end")
 }

 fun reset(){
     Log.d("MainActivity", "reset")
  }

我在我的活动中的某个任意位置调用它,但从未调用 reset() 方法。在日志中我只得到以下

D/MainActivity: start

它看起来像它在 postDelay 上的阻塞.. 即使我将值设置为 1 或将 postDelay 替换为姿势,也不起作用。

更新:

当我这样实现时,它可以工作;

 private lateinit var handler : Handler

 override fun onCreate(savedInstanceState: Bundle?) {
    handler = Handler()
    resetAnimations()
 }

 override fun resetAnimations() {
    handler.postDelayed( { reset()}, 1500)
 }

我认为问题与我从后台线程调用 resetAnimations() 并在后台线程上创建处理程序这一事实有关..

【问题讨论】:

  • 可能你永远不会调用 resetAnimations
  • @crgarridos 在那里更新了你的问题。显然我在调用 resetAnimations!
  • 那么你是从 mainThread 以外的另一个线程调用 resetAnimation 吗?

标签: java kotlin runnable android-handler android-looper


【解决方案1】:

我从后台线程调用resetAnimations()

这就是问题所在。您的处理程序无法将Message 发布到MessageQueue,因为您的后台线程上没有任何MessageQueue

所以,不要这样:

Handler().postDelayed( { reset()}, 1500)

执行此操作:

Handler(Looper.getMainThread()).postDelayed( { reset()}, 1500)

【讨论】:

  • 是的,就是这样。谢谢!这会在 Java 中引发某种被 kotlin 吞噬的异常吗?
  • @sirFunkenstine,我不知道。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多