Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 处理程序postDelayed和Thread.sleep()_Android_Handler_Thread Sleep - Fatal编程技术网

Android 处理程序postDelayed和Thread.sleep()

Android 处理程序postDelayed和Thread.sleep(),android,handler,thread-sleep,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)

我的代码中有一个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()是否会干扰处理程序


编辑:此代码的目的是,我只想在断开连接延迟秒已经过去之后继续程序。因此,如果用户提前单击,我必须等待经过的时间结束。

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


使用处理程序的
postDelayed

我假设您的
处理程序与另一个循环运行的同一线程相关联。(处理程序
与创建它的线程相关联。)

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

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


要完成您试图执行的操作,请取消睡眠,只需使用
postDelayed()
发布一个
Runnable
,它会更改您的应用程序状态(就像您通过设置成员变量
错误断开连接所做的那样)。然后在
onClick()
中,只需检查应用程序状态(
mIsDisconnect
标志)是否可以继续。最好的方法是使用哨兵:

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

我正在使用postDelayed。补充了关于我想做什么的解释。我明白了。如果你让线程处于睡眠状态,第一部分就不会发生。同样,避免使用“Thread.sleep()”。试着阅读。您可以添加或删除处理程序中的消息,可能会有所帮助。在简单的
线程中,sleep
会阻止其他进程,而
postDelayed
则不会。