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.
- Cómo determinar si la tarea del temporizador ha finalizado
- Detener el temporizador y continuar
- ¿Cómo comprobar si un temporizador todavía está funcionando o no?
- Android relanzando temporizadores después de que se cancelen
- Recibir un valor de cadena en MainActivity de SecondActivity y luego contarlo hacia abajo
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 );
- CountDownTimer en Android
- Temporizador Android actualizando una vista de texto (UI)
- ¿Cómo agregar tiempo al temporizador de cuenta atrás?
- Ejecución de una tarea asíncrona dentro de un temporizador en Android
- Enviar notificación una vez por semana
- Cambiar horario scheduleAtFixedRate
- Programación de Android Timer vs. scheduleAtFixedRate
- Temporizador en segundo plano
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(); }
- Cómo ofuscar mi proyecto android en IDE eclipse?
- Obtener la posición de imageview en el diseño android