Мне нужно, чтобы поток запускался через 3 секунды бездействия кнопки, есть ли простой способ сделать это?
Я создаю приложение-счетчик, кнопка запускает два счетчика, общий счетчик и «счетчик нажатий», счетчик нажатий помогает отслеживать фактическое изменение значений, показывая, сколько нажатий сделал пользователь, мне нужно, чтобы он исчез через несколько секунд, чтобы пользователь мог нажать снова.
Сначала вы создаете Timer
с TimerTask
(с вашим потоком) и планируете его запуск через 3 секунды.
Каждый раз, когда вы нажимаете кнопку, вы сбрасываете таймер.
public class MyClass{
private Timer timer=new Timer()
private TimerTask task=new TimerTask(){
public void run(){
//your action
}
};
public void init(){
timer.schedule(task,3000);
}
public void onButtonClick(){
task.cancel();
timer.schedule(task,3000);
}
}
для таких вещей я обычно использую Обработчик с Запускаемый, чтобы делать что-то после X milliseconds
пользователь не выполняет определенного действия.
Сначала создайте runnable
и handler
final android.os.Handler handler = new android.os.Handler();
private Runnable runnable;
private final long DELAY = 3000; // how many milliseconds you want to wait
Затем добавьте onClickListener
:
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Затем внутри события onClick
удалите callbacks
и снова определите handler
следующим образом:
if (runnable != null) {
// in this case the user already clicked once at least
handler.removeCallbacks(runnable);
}
runnable = new Runnable() {
@Override
public void run() {
//this code will run when user isn't clicking for the time you set before.
}
};
handler.postDelayed(runnable, DELAY);
Конечный результат:
final android.os.Handler handler = new android.os.Handler();
private Runnable runnable;
private final long DELAY = 3000; // how many milliseconds you want to wait
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// all your previous stuffs
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (runnable != null) {
// in this case the user already clicked once at least
handler.removeCallbacks(runnable);
}
runnable = new Runnable() {
@Override
public void run() {
//this code will run when user isn't clicking for the time you set before.
}
};
handler.postDelayed(runnable, DELAY);
}
});
}
Я надеюсь, что это поможет, по любому вопросу, не стесняйтесь спрашивать
Обработчик может работать в этом сценарии с задержкой в 3000 миллисекунд.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// do action
}
}, 3000);
вы должны останавливать его при каждом щелчке, иначе он просто запустит обработчик для каждого щелчка, не учитывая, нажимает ли пользователь по-прежнему или нет.