处理程序postDelayed和Thread.sleep()

时间:2013-09-10 07:30:08

标签: android handler thread-sleep

我的代码中有一个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秒已经过去之后才继续该程序。因此,如果用户提前点击,我必须等待经过的时间才能完成。

3 个答案:

答案 0 :(得分:12)

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

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

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

要完成您尝试执行的操作,请移除睡眠,然后使用postDelayed()发布更改您的应用状态的Runnable(就像您已经通过设置成员变量{ {1}})。然后在mIsDisconnect中检查应用状态(onClick()标志)是否可以继续。

答案 1 :(得分:1)

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

改为使用处理程序的postDelayed

答案 2 :(得分:0)

最好的方法是使用哨兵:

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);