我有一个按钮,当点击此按钮时,我想做一些动作并将它们还原,让我们说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;
}
所以直到循环正在模拟延迟并在我做我想要的之后。有什么建议吗?
答案 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
}
};