Android: ejecuta un hilo repetidamente dentro de un temporizador

En primer lugar, ni siquiera podía elegir el método de usar, estoy leyendo durante horas y alguien dice que el uso de "manejadores", alguien dice que el uso de "temporizador". Esto es lo que intento lograr:

En las preferencias, hay un ajuste (casilla de verificación) que para habilitar / deshabilitar el trabajo de repetición. Cuando se marca esta casilla de verificación, el temporizador debe comenzar a funcionar y el hilo debe ejecutarse cada x segundos. Como la casilla de verificación está desmarcada, el temporizador debe detenerse.

Aquí está mi código:

Comprobando si la casilla de verificación está marcada o no, si está marcada se actualizará 'refreshAllServers' que ejecutará el trabajo con temporizador.

boolean CheckboxPreference = prefs.getBoolean("checkboxPref", true); if(CheckboxPreference == true) { Main main = new Main(); main.refreshAllServers("start"); } else { Main main = new Main(); main.refreshAllServers("stop"); } 

El refreshAllServers void que realiza el trabajo del temporizador:

 public void refreshAllServers(String start) { if(start == "start") { // Start the timer which will repeatingly execute the thread } else { // stop the timer } 

Y aquí es cómo ejecuto mi hilo: (Funciona bien sin temporizador)

 Thread myThread = new MyThread(-5); myThread.start(); 

¿Qué intenté?

Intenté cualquier ejemplo que pudiera ver de Google (manejadores, temporizador) ninguno de ellos funcionó, me las arreglé para iniciar el temporizador una vez, pero detenerlo no funcionó. El código más simple y comprensible que vi en mi investigación fue este:

 new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { // your code here } }, 5000 ); 

Simplemente utilice el siguiente fragmento

 private Handler handler = new Handler(); private Runnable runnable = new Runnable() { public void run() { // // Do the stuff // handler.postDelayed(this, 1000); } }; runnable.run(); 

Para detener su uso

 handler.removeCallbacks(runnable); 

Debería hacer el truco.

Gracias a todos, arreglé este problema con el uso de Timer.

  timer = new Timer(); timer.scheduleAtFixedRate( new java.util.TimerTask() { @Override public void run() { for(int i = 0; i < server_amount; i++) { servers[i] = "Updating..."; handler.sendEmptyMessage(0); new MyThread(i); myThread.start(); } }}, 2000, 5000 ); 

Yo creo que usar AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html

Si la casilla está en el método de llamada donde

 AlarmManager alarmManager = (AlarmManager)SecureDocApplication.getContext() .getSystemService(Context.ALARM_SERVICE); PendingIntent myService = PendingIntent.getService(context, 0, new Intent(context, MyService.class), 0); long triggerAtTime = 1000; alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 5000 /* 5 sec*/, myService); 

Si la casilla de verificación está desactivada, cancele el administrador de alarmas

 alarmManager.cancel(myService); 

Utilice un CountDownTimer. La forma en que funciona es que llamará a un método en cada tick del temporizador, y otro método cuando el temporizador termina. En ese momento puede reiniciar si es necesario. También creo que probablemente debería estar lanzando AsyncTask en lugar de hilos. No intentes administrar tus propios temas en Android. Intente lo siguiente. Su funciona como un reloj.

  CountDownTimer myCountdownTimer = new CountDownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); // Kick off your AsyncTask here. } public void onFinish() { mTextField.setText("done!"); // the 30 seconds is up now so do make any checks you need here. } }.start(); 

"La clase [ScheduledThreadPoolExecutor] es preferible a Timer cuando se necesitan varios subprocesos de trabajo o cuando se requiere la flexibilidad o capacidades adicionales de ThreadPoolExecutor (que esta clase se extiende)".

por…

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

No es mucho más que el manejador, pero tiene la opción de ejecutar exactamente de vez en cuando (vice un retraso después de cada finalización de cálculo).

 import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; ... final int THREAD_POOL_SIZE = 10; final int START_DELAY = 0; final int TIME_PERIOD = 5; final TimeUnit TIME_UNIT = TimeUnit.SECONDS; ScheduledThreadPoolExecutor pool; Runnable myPeriodicThread = new Runnable() { @Override public void run() { refreshAllServers(); } }; public void startTimer(){ pool.scheduleAtFixedRate(myPeriodicThread, START_DELAY, TIME_PERIOD, TIME_UNIT); } public void stopTimer(){ pool.shutdownNow(); } 
  • Android / phonegap - Tiempo de respuesta del clic lento
  • OnPause / onResume problemas de actividad
  • Programación de Android Timer vs. scheduleAtFixedRate
  • Cambiar horario scheduleAtFixedRate
  • ¿Cómo puedo detener un temporizador?
  • Equivalente a javax.swing.Timer en Android
  • Java - Timer.cancel () v / s TimerTask.cancel ()
  • Hacer un temporizador de intervalo en Java android
  • ¿Cómo usar Android AlarmManager con intervalos pequeños como 1 minuto?
  • Recibir un valor de cadena en MainActivity de SecondActivity y luego contarlo hacia abajo
  • ¿Hay una manera de encontrar los temporizadores de ejecución en java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.