Я хочу сделать паузу между двумя строками кода, позвольте мне объяснить немного:
-> пользователь нажимает кнопку (фактически карту), и я показываю ее, изменяя фон этой кнопки:
thisbutton.setBackgroundResource(R.drawable.icon);
-> после, скажем, 1 секунды, мне нужно вернуться к предыдущему состоянию кнопки, изменив ее фон:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> Я пытался приостановить поток между этими двумя строками кода с помощью:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Однако это не работает. Может быть, мне нужно приостановить процесс, а не поток?
Я также пытался (но это не работает):
new Reminder(5);
С этим:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Как я могу приостановить / спать поток или процесс?
android
process
multithreading
Хьюберт
источник
источник
(!conditionCheck()) {}
правило, не рекомендуется.Ответы:
Одним из решений этой проблемы является использование метода Handler.postDelayed () . Некоторые учебные материалы Google предлагают такое же решение.
Однако некоторые отмечают, что приведенное выше решение вызывает утечку памяти, поскольку оно использует нестатический внутренний и анонимный класс, который неявно содержит ссылку на свой внешний класс, активность. Это проблема, когда контекст активности собирается мусором.
Более сложное решение , которое позволяет избежать утечек памяти подкласса
Handler
иRunnable
со статическими внутренними классами внутри деятельности , так как статические внутренних классы не занимающим неявную ссылки на их внешний класс:Обратите внимание, что
Runnable
используется WeakReference для Activity, что необходимо в статическом классе, которому требуется доступ к пользовательскому интерфейсу.источник
final Button mynewbutton = mybutton;
и использовать егоmynewbutton
в обработчике и Runnable.Вы можете попробовать это короткое
ВНИМАНИЕ : Никогда, никогда не делайте этого в потоке пользовательского интерфейса.
Используйте это, чтобы спать, например. фоновый поток.
Полное решение для вашей проблемы будет: Это доступно API 1
Без создания tmp Handler. Также это решение лучше, чем @tronman, потому что мы не сохраняем представление Handler. Также у нас нет проблем с обработчиком, созданным в плохом потоке;)
Документация
Код для postDelayed из класса View:
источник
OMG of course do this in background thread
имеет значения, если только вы не показываете, КАК поместить его в фоновый поток. В это время вы обнаружите, что у вас есть ответ более сложный, чем уже принятый ответ. Я упоминал, что лучшее решение было принято три года назад? : PHandler + postRunnable
выполняет все это, в один шаг. Без системных накладных расходов на создание второго потока.Я использую это:
источник
e.getLocalizedMessage()
должен делать?Handler/postDelayed
решение имеет два преимущества: (1) избегает системных издержек 2-го потока, (1) выполняется в потоке пользовательского интерфейса, поэтому может вносить изменения в пользовательский интерфейс, не вызывая исключения.Вы, вероятно, не хотите делать это таким образом. Помещая явное
sleep()
в обработчик событий, который нажимают кнопки, вы фактически блокируете весь интерфейс на секунду. Одна альтернатива состоит в том, чтобы использовать какой-то один таймер . Создайте TimerTask, чтобы изменить цвет фона обратно на цвет по умолчанию, и запланируйте его на таймере.Другая возможность - использовать обработчик . Есть учебник о ком-то, кто переключился с использования таймера на использование обработчика.
Кстати, вы не можете приостановить процесс. Процесс Java (или Android) имеет как минимум 1 поток, и вы можете только спящие потоки.
источник
Я использую CountDownTime
источник
Это то, что я сделал в конце дня - теперь работает нормально:
источник
В дополнение к ответам г-на Янковского, вы также можете использовать
postDelayed()
. Это доступно на любомView
(например, на вашей карте) и занимает aRunnable
и период задержки. ВыполняетсяRunnable
после этой задержки.источник
Это мой пример
Создайте Java Utils
источник
Или вы можете использовать:
который имеет то преимущество, что не требует упаковки
try ... catch
.источник
Если вы используете Kotlin и сопрограммы , вы можете просто сделать
И если вам нужно обновить интерфейс
источник
Я знаю, что это старая ветка, но в документации по Android я нашел решение, которое мне очень помогло ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Надеюсь, это поможет кому-то ...
источник
И чтобы быть вдвойне уверенным, вы можете комбинировать его с методом «статического класса», как описано в ответе tronman.
источник