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 puedo implementar un Timer / TimerTask que ejecuta un AsyncTask? (Androide)
- Intentar invocar método virtual
- Actualizar una vista de texto aunque el usuario no esté utilizando mi aplicación
- Eliminación del fondo de una animación de marco en Android
- CountDownTimer.cancel () no funciona en Android
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 );
- No recibe datos de ubicación del hilo
- Android: contador simple del tiempo
- Temporizador en segundo plano
- Ejecución de una tarea asíncrona dentro de un temporizador en Android
- Temporizador de cuenta atrás Android La barra de progreso circular no coincide con el temporizador
- Manejador o temporizador android
- Resched. Timer after cancel da "java.lang.IllegalStateException: Timer cancelado."
- Android relanzando temporizadores después de que se cancelen
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