Android – циклическая часть кода каждые 5 секунд

Я хотел бы начать повторять две строки кода каждые 5 секунд, когда я нажимаю кнопку START и заканчиваю ее, когда нажимаю кнопку STOP. Я старался использовать TimerTask и Handles, но не мог понять, как это сделать.

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //final int i; final TextView textView = (TextView) findViewById(R.id.textView); final Button START_STOP = (Button) findViewById(R.id.START_STOP); final ImageView random_note = (ImageView) findViewById(R.id.random_note); final int min = 0; final int max = 2; final Integer[] image = { R.drawable.a0, R.drawable.a1,R.drawable.a2 }; START_STOP.setTag(1); START_STOP.setText("START"); START_STOP.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int status = (Integer) v.getTag(); if (status ==1) { textView.setText("Hello"); START_STOP.setText("STOP"); v.setTag(0); final Random random = new Random(); //************************************************************ // I would like to loop next 2 lines of code every 5 seconds.// int i = random.nextInt(2 - 0 + 1) + 0; random_note.setImageResource(image[i]); //************************************************************ } else { textView.setText("Bye"); START_STOP.setText("Let's PLAY!"); v.setTag(1); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Использование CountDownTimer, как и в одном из других ответов, является одним из способов сделать это. Другим было бы использование Handler и метода postDelayed :

 private boolean started = false; private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() { final Random random = new Random(); int i = random.nextInt(2 - 0 + 1) + 0; random_note.setImageResource(image[i]); if(started) { start(); } } }; public void stop() { started = false; handler.removeCallbacks(runnable); } public void start() { started = true; handler.postDelayed(runnable, 2000); } 

Вот пример использования таймера и TimerTask:

 private Timer timer; private TimerTask timerTask = new TimerTask() { @Override public void run() { final Random random = new Random(); int i = random.nextInt(2 - 0 + 1) + 0; random_note.setImageResource(image[i]); } }; public void start() { if(timer != null) { return; } timer = new Timer(); timer.scheduleAtFixedRate(timerTask, 0, 2000); } public void stop() { timer.cancel(); timer = null; } 

Вы можете использовать CountDownTimer следующим образом:

 private CountDownTimer timer; timer = new CountDownTimer(5000, 20) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { try{ yourMethod(); }catch(Exception e){ Log.e("Error", "Error: " + e.toString()); } } }.start(); 

А затем снова вызвать таймер:

 public void yourMethod(){ //do what you want timer.start(); } 

Чтобы отменить таймер, вы можете вызвать timer.cancel();

Надеюсь, поможет!

Вы можете использовать RxJava2 / RxAndroid2 и создать Observable, который испускает сообщение каждую секунду (или что угодно), например, с псевдокодом:

 Disposable timer = Observable.interval(1000L, TimeUnit.MILLISECONDS) .timeInterval() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer>() { @Override public void accept(@NonNull Timed longTimed) throws Exception { //your code here. Log.d(TAG, new DateTime()); } }); 

Когда вы хотите остановить его, вы можете просто позвонить:

 timer.dispose(); 

Я считаю этот код более понятным, чем другие.

Мне нечего добавить, кроме упоминания различий между использованием Handler, CountDownTimer и регулярным таймером. Как упоминалось выше, CountDownTimer использует обработчик внутри себя, поэтому это эквивалентно использованию обработчика напрямую. Обработчик используется для запуска файлов Ui в течение очень коротких периодов времени. Примером может быть setText для текстового представления. Для вычислительно-интенсивных задач обработчики могут вызвать задержку. Таймер также может выполнять только короткие задачи, но это не обязательно только для содержимого пользовательского интерфейса. Для более сложных задач следует использовать новый stream.

  • Как вычислить прошедшее время события в java?
  • Давайте будем гением компьютера.