1

我确实有一个按钮,当单击此按钮时,我想做一些操作并将它们恢复回来,让我们说 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;
            }

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

4

6 回答 6

7

使用Handler,如下所示:

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

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

于 2012-05-30T04:50:09.633 回答
2

你有一个方法来做到这一点:

Thread.sleep(5000)

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

于 2012-05-30T04:49:25.167 回答
2

繁忙的循环是一个坏主意 - 它会消耗你的电池。也许Thread.sleep会更好。

于 2012-05-30T04:50:20.973 回答
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)方法。

于 2012-05-30T04:52:08.497 回答
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 停止新的点击,直到无法

于 2012-05-30T04:56:09.100 回答
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
        }
    };
于 2012-05-30T04:55:01.393 回答