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(); } 
  • Temporizador de cuenta atrás Android La barra de progreso circular no coincide con el temporizador
  • Visibilidad de ImageView Error con temporizador
  • Cómo mostrar el temporizador en android
  • Temporizador () como Daemon Vs non Daemon
  • Android equivalente de setTimeout y clearTimeout de javascript?
  • Intentar invocar método virtual
  • Android - Cómo detener y detener el temporizador
  • Tema de Android Simple Timer / Timertask
  • Android - No puede eliminar la red Wifi de forma programática El método removeNetwork (int) en el tipo WifiManager no es aplicable a los argumentos (String)
  • ¿Temporizador Android? ¿Cómo?
  • Android 2.2: ¿Cómo actualizar las vistas de texto automáticamente con un temporizador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.