У меня есть кнопка, и когда эта кнопка нажата, я хочу сделать некоторые действия и вернуть их обратно, чтобы сказать 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;
}
поэтому до тех пор, пока цикл не работает, его симуляция задержки и после того, как я сделаю то, что хочу. Любой совет?
Используйте обработчик, что-то вроде этого:
new Handler().postDelayed(new Runnable() {
void run() {
// do something later
}
}, 5000);
Изменение: обратите внимание, что это решение позволяет продолжить основной поток во время задержки - обновить графический интерфейс, правильно Thread.sleep()
изменения активности (например, кнопку "Главная") и т.д. Использование Thread.sleep()
- нет.
Thread.sleep
.
У вас есть способ сделать это:
Thread.sleep(5000)
Он может вызывать InterruptedException, поэтому вы должны его поймать.
Занятая петля - плохая идея - она пожирает ваши батареи. Возможно, Thread.sleep
будет работать лучше.
вы можете получить представление о 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, чтобы остановить новый клик, пока не получите
Попробуйте этот код,
// 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)
метод public void onClick(View v)
.
Возможно, вы захотите рассмотреть 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
}
};