处理程序postDelay()来自后台线程

时间:2017-09-28 10:16:40

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

任何人都可以看到为什么这不起作用的原因吗?

 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()并在后台线程上创建处理程序这一事实有关。

1 个答案:

答案 0 :(得分:3)

  

我是从后台主题调用resetAnimations()

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

所以,而不是:

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

执行此操作:

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