【问题标题】:Handler postDelayed and Thread.sleep()处理程序 postDelayed 和 Thread.sleep()
【发布时间】:2013-09-10 07:30:07
【问题描述】:

我的代码中有一个 thread.sleep 和一个处理程序 postDelayed:

handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        Log.e(TAG, "I ran");
        mIsDisconnect = false;
    }
}, DISCONNECT_DELAY);

在处理程序代码之后和用户按下按钮之后,我有这个:

while (mIsDisconnect) {
    try {
        Thread.sleep(DELAY);
    } catch (InterruptedException e) {
        Log.e(TAG, "problem sleeping");
    }
}

如果用户等待的时间足够长,我可以在我的日志中看到“我跑了”。但是如果用户在延迟结束之前按下按钮,似乎 postDelayed 永远没有机会执行。我的问题是,thread.sleep() 是否与处理程序 postDelayed 混淆?

编辑:这段代码的目的是我想在 DISCONNECT_DELAY 秒已经过去之后继续程序。所以如果用户点击到早,我必须等待经过的时间才能完成。

【问题讨论】:

  • 简单来说,Thread.sleep 会阻止其他进程,而postDelayed 不会。

标签: android handler thread-sleep


【解决方案1】:

我假设您的 handler 与另一个循环正在运行的同一线程相关联。 (Handler 与创建它的线程相关联。)

postDelayed()Runnable 放入处理程序线程的消息队列中。当控制权返回到线程的Looper 时处理消息队列。

Thread.sleep() 只是阻塞线程。控件不会返回到Looper 并且无法处理消息。在 UI 线程中休眠几乎总是错误的。

要完成您正在尝试做的事情,请移除睡眠并简单地使用postDelayed() 发布一个Runnable 来更改您的应用程序状态(就像您已经通过设置成员变量mIsDisconnect 所做的那样)。然后在onClick() 中检查应用状态(mIsDisconnect 标志)是否可以继续。

【讨论】:

    【解决方案2】:

    我猜第二部分在主线程上运行,您没有在线程之间移动。
    你不能让主线程进入睡眠状态,你可以停止所有 UI 问题和其他应该在这个线程(主线程)上运行的东西。

    改用处理程序的postDelayed

    【讨论】:

    • 我正在使用 postDelayed。添加了关于我尝试做什么的附加说明。
    • 我明白了。如果您将线程置于睡眠状态,第一部分将不会发生。再次,避免使用'Thread.sleep()'。尝试阅读developer.android.com/reference/android/os/Handler.html。您可以从处理程序中添加或删除消息,也许它会有所帮助。
    【解决方案3】:

    最好的办法是带哨兵:

    runnable = new Runnable() {
        @Override
        public void run() {
    
        // condition to pass (sentinel == 1)
            if (isActive == 0) {
                handler.postDelayed(this, 1000); // 1 seconds
            }
            else {
            // isActive == 1, we pass!
    
            // Do something aweseome here!
    
            }
    
    
         }
    };
    handler = new Handler();
    handler.postDelayed(runnable, 100);
    

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2011-05-20
      • 2016-06-27
      • 2016-05-01
      • 2014-02-21
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多