Java 模拟单击按钮时的延迟

Java 模拟单击按钮时的延迟,java,android,Java,Android,我有一个按钮,当这个按钮被点击时,我想做一些动作,然后把它们还原回来,比如说5秒钟。例如,当单击按钮A时,TextA.Text变为“单击”5秒,5秒后文本值应恢复为原始值。这就是我所拥有的,但我觉得这是完全错误的方式。不延迟的代码: diff=time2-time1; while (diff<5000) { //Log.d("Timer is", String.valueOf(diff)); time

我有一个按钮,当这个按钮被点击时,我想做一些动作,然后把它们还原回来,比如说5秒钟。例如,当单击按钮A时,TextA.Text变为“单击”5秒,5秒后文本值应恢复为原始值。这就是我所拥有的,但我觉得这是完全错误的方式。不延迟的代码:

diff=time2-time1;

            while (diff<5000) {
                //Log.d("Timer is", String.valueOf(diff));
                time2=System.currentTimeMillis();
                diff=time2-time1;
            }
diff=time2-time1;

而(diff您有一种方法可以做到这一点:

Thread.sleep(5000)

它可能引发InterruptedException,因此您必须捕获它。

您有一种方法可以做到这一点:

Thread.sleep(5000)
它可能会抛出InterruptedException,因此您必须捕获它。

使用一个,类似以下内容:

new Handler().postDelayed(new Runnable() {
    void run() {
        // do something later
    }
}, 5000);
编辑:请注意,此解决方案允许主线程在延迟期间继续-刷新GUI、正确处理活动更改(如“主页”按钮)等。使用
thread.sleep()
不会。使用类似以下内容的

new Handler().postDelayed(new Runnable() {
    void run() {
        // do something later
    }
}, 5000);

编辑:请注意,此解决方案允许主线程在延迟期间继续-使用
thread.sleep()刷新GUI、正确处理活动更改(如“主页”按钮)等
没有。

忙循环是个坏主意-它会把你的电池生吞活剥。也许会更好。

忙循环是个坏主意-它会把你的电池生吞活剥。也许会更好。

试试这个代码

// First save the current value of Textbox in a variable 
String tmpVal = myEditText.getText();
// Now Setting of new Value for 2 seconds 
myEditText.setText ( "Clicked" );
// Sleeping for 5 seconds
try
{
     Thread.sleep(5000);
}
//Now Returning back to your old value
myEditText.setText ( tmpVal );
上面的所有代码都进入了public void onClick(视图v)
方法。

试试这段代码

// First save the current value of Textbox in a variable 
String tmpVal = myEditText.getText();
// Now Setting of new Value for 2 seconds 
myEditText.setText ( "Clicked" );
// Sleeping for 5 seconds
try
{
     Thread.sleep(5000);
}
//Now Returning back to your old value
myEditText.setText ( tmpVal );

以上所有代码都进入了
public void onClick(View v)
方法。

您可能希望将AsyncTasks视为一个容器,在其中执行您的工作。此外,您可以在其中调用Thread.sleep。完成工作后,可以要求处理程序对象更改标题

在AsyncTask中执行此操作而不只是休眠主线程的原因是您的应用程序不会“冻结”。以下是如何使用它:

private class AsyncHttpRequest extends AsyncTask<Void, Void, Void>{
        @Override
        protected Void doInBackground(Void... params) {
            Thread.sleep(5000);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            _jobHandler.sendEmptyMessage(0);
        }
    }

protected Handler _jobHandler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            // set the caption here
        }
    };
私有类AsyncHttpRequest扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
睡眠(5000);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
_jobHandler.sendEmptyMessage(0);
}
}
受保护的处理程序_jobHandler=新处理程序(){
@凌驾
公共无效调度消息(消息消息消息){
//在这里设置标题
}
};

您可能希望将AsyncTasks视为执行工作的容器。此外,您可以在其中调用Thread.sleep。工作完成后,可以要求处理程序对象更改标题

在AsyncTask中执行此操作而不只是休眠主线程的原因是您的应用程序不会“冻结”。以下是如何使用它:

private class AsyncHttpRequest extends AsyncTask<Void, Void, Void>{
        @Override
        protected Void doInBackground(Void... params) {
            Thread.sleep(5000);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            _jobHandler.sendEmptyMessage(0);
        }
    }

protected Handler _jobHandler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            // set the caption here
        }
    };
私有类AsyncHttpRequest扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
睡眠(5000);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
_jobHandler.sendEmptyMessage(0);
}
}
受保护的处理程序_jobHandler=新处理程序(){
@凌驾
公共无效调度消息(消息消息消息){
//在这里设置标题
}
};

您可以在Onclick上获得视图,并可以使用

@Override
public void onClick(final View v) {
    if(v.getId() == R.id.button1) {

    if(isClikcalbe ){
isClikcalbe  = false;
      view.postDelayed(new Runnable() {

            @Override
            public void run() {

                // you code 
                 isClikcalbe = true;
            }
        }, 5000);
   }

    }
}

也可以使用bollean IsClickalBe停止新的单击,直到无法执行为止

您可以在Onclick上获得视图,并可以使用

@Override
public void onClick(final View v) {
    if(v.getId() == R.id.button1) {

    if(isClikcalbe ){
isClikcalbe  = false;
      view.postDelayed(new Runnable() {

            @Override
            public void run() {

                // you code 
                 isClikcalbe = true;
            }
        }, 5000);
   }

    }
}

也可以使用bollean IsClickalBe停止新点击直到无法

dangit你打败了我,我是gunna说xDdangit你打败了我,我是gunna说xD+1从文档判断,我认为这比
线程更好。睡眠
。很好。谢谢,这是我想要的。简单,就我的知识水平而言。这段代码有多高效?a当用户使用其他gui元素时,它是否会使线程意外停止?+1从文档中判断,我认为这比
线程更好。睡眠
。很好。谢谢,这就是我想要的。很简单,就我的知识水平而言。这段代码有多高效?当用户使用h其他gui元素?我不知道这一点,我认为大多数答案将被视为答案。感谢这些信息,将来我会的。你可以回到你所有的老问题,并在那里接受最好的答案,而不仅仅是未来的问题!当然,我现在就做。我不知道这一点,我认为most答案将被评为答案。感谢您提供的这些信息,以后我会的。您可以回到您以前的所有问题,并在那里接受最好的答案,而不仅仅是未来的问题!当然,我现在就做。thread.sleep或使用上面评论中的处理程序哪个更好?根据您的回答年龄,Threa.Sleep会更好,因为您只有一个操作要执行。哪个更好,thread.Sleep,还是使用上述注释中的处理程序?根据您的使用情况,Threa.Sleep会更好,因为您只有一个操作要执行。