单击按钮时模拟延迟

时间:2012-05-30 04:46:29

标签: java android

我有一个按钮,当点击此按钮时,我想做一些动作并将它们还原,让我们说5秒钟。例如,当单击按钮A时,TextA.Text变为“Clicked”5秒,在5秒内文本的值应恢复到原始值。我在这里有什么,但我觉得这是完全错误的方式。延迟的代码:

diff=time2-time1;

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

所以直到循环正在模拟延迟并在我做我想要的之后。有什么建议吗?

6 个答案:

答案 0 :(得分:7)

使用Handler,如下所示:

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

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

答案 1 :(得分:2)

你有办法做到这一点:

Thread.sleep(5000)

它可以抛出InterruptedException,所以你必须抓住它。

答案 2 :(得分:2)

忙碌循环是一个坏主意 - 它会让你的电池充满活力。也许Thread.sleep会更好。

答案 3 :(得分:1)

试试这段代码,

// 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)方法。

答案 4 :(得分:1)

您可以在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 isClikcalbe来阻止新点击,直到无法

答案 5 :(得分:0)

您可能希望将AsyncTasks视为您工作的容器。此外,您可以在其中调用Thread.sleep。完成作业后,可以请求Handler对象更改标题。

在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
        }
    };