2012-07-24 10 views
11

Antes que nada, no podía elegir el método a usar, estoy leyendo durante horas y alguien dice 'utilizar', alguien dice usar 'Temporizador'. Esto es lo que trato de lograr:Android - Ejecuta un hilo de forma repetida dentro de un temporizador

En las preferencias, hay una configuración (casilla de verificación) para activar/desactivar el trabajo repetido. Cuando se marca esa casilla de verificación, el temporizador debería comenzar a funcionar y el hilo debería ejecutarse cada x segundos. Como la casilla de verificación está desmarcada, el cronómetro debe detenerse.

Aquí está mi código:

Comprobación de que si casilla de verificación está marcada o no, si se marca nula '' refreshAllServers se ejecutará la que hace 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 vacío que hace 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 así es como yo haga mi hilo: (funciona bien sin temporizador)

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

Lo he intentado?

Probé cualquier ejemplo que pude ver de Google (controladores, temporizador) ninguno de ellos funcionó, logré iniciar el temporizador una vez pero detenerlo no funcionó. El más simple & código comprensible que vi en mi investigación fue la siguiente:

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

ver si la respuesta [aquí] (http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or-handler/8102488#8102488) ayuda – yorkw

Respuesta

34

usar Simplemente por debajo de fragmento de código

private Handler handler = new Handler(); 
private Runnable runnable = new Runnable() { 
    public void run() { 
     // 
     // Do the stuff 
     // 

     handler.postDelayed(this, 1000); 
    } 
}; 
runnable.run(); 

para detenerlo utilizar

handler.removeCallbacks(runnable); 

debe hacer el truco.

+0

Tu solución funcionó bien también, ya que encontré otra solución. – sarkolata

+0

Creo que esta es la mejor solución. –

+2

¿Qué pasa si el usuario quiere lograr algo que utiliza conexión a internet? aplicar lo anterior hará que el controlador y el ejecutable se ejecuten en el hilo de la interfaz de usuario, lo que impide hacer cosas en la red. Necesita implementar hilo allí. – tony9099

1

yo creo que utilizar AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html

Si casilla de verificación está en el método de llamadas 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 está sin cancelar el administrador de alarmas

alarmManager.cancel(myService); 
+0

¿Y cuál es la parte en la que insertaré mi código? – sarkolata

+1

Tiene una variable de miembro de clase que es instancia de administrador de alarma. Cuando la casilla de verificación está activada, llame a un método con ese código. cuando fuera del método de llamada para cerrar el administrador de alarmas. Esto sucederá cuando el usuario navegue por las actividades, luego en la clase de aplicación heredada. Si el usuario puede salir de la aplicación y aún necesita ejecutarse, entonces en el servicio. – Maxim

1

Use un CountDownTimer. La forma en que funciona es que llamará a un método en cada tic del temporizador, y otro método cuando termine el temporizador. En ese punto puede reiniciar si es necesario. También creo que probablemente deberías iniciar AsyncTask en lugar de hilos. No intente administrar sus propios hilos en Android. Intente lo siguiente. 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(); 
+0

Esto no repetidamente hace la cosa. ¡Lo hizo una vez y luego se detuvo! – sarkolata

+0

Sí, no se ejecuta indefinidamente. Si desea ejecutarlo indefinidamente, podría considerar un servicio en segundo plano. Por otro lado, no hay nada que le impida reiniciar el temporizador de cuenta regresiva si las condiciones son correctas, o desde establecer una duración más larga. –

2

Gracias a todos, arreglé este problema con el uso del temporizador.

   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 
        ); 
+0

Indique las ventajas de esta solución sobre las demás. No lo estoy viendo –

+0

Sin ventajas, descubrí que la respuesta de Coders Paradise también está funcionando después de que comencé a trabajar. – sarkolata

0

"[ScheduledThreadPoolExecutor] clase es preferible temporizador cuando se necesitan múltiples subprocesos de trabajo, o cuando se requiere la flexibilidad adicional o capacidades de ThreadPoolExecutor (que esta clase se extiende)."

por ...

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

que no es mucho más que el controlador, pero tiene la opción de ejecutar exactamente cada cierto tiempo (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(); 

} 
Cuestiones relacionadas