Android ejecutar hilo en el servicio cada X segundos

Quiero crear un hilo en un servicio de Android que se ejecute cada X segundos

Estoy utilizando actualmente, pero el método postdelayed parece realmente lag mi aplicación.

@Override public int onStartCommand(Intent intent, int flags, int startId){ super.onStartCommand(intent, flags, startId); startRepeatingTask(); return startId; } private final static int INTERVAL = 20000; //20 milliseconds Handler m_handler = new Handler(); Runnable m_handlerTask = new Runnable() { @Override public void run() { // this is bad m_handler.postDelayed(m_handlerTask, INTERVAL); } }; void startRepeatingTask() { m_handlerTask.run(); } void stopRepeatingTask() { m_handler.removeCallbacks(m_handlerTask); stopSelf(); } 

Quiero hacer un nuevo hilo como este:

  public void threadRun() { Thread triggerService = new Thread(new Runnable(){ public void run(){ Looper.prepare(); try{ //do stuff here? }catch(Exception ex){ System.out.println("Exception in triggerService Thread -- "+ex); }//end catch }//end run }, "aThread"); triggerService.start(); //perhaps do stuff here with a timer? timer1=new Timer(); timer1.scheduleAtFixedRate(new methodTODOSTUFF(), 0, INTERVAL); } 

No estoy seguro de la mejor manera de hacer un hilo de fondo para ejecutar en un intervalo determinado, la comprensión de apreciación!

Hay varias maneras alternativas de hacerlo. Personalmente, prefiero usar ScheduledExecutorService :

 ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); // This schedule a runnable task every 2 minutes scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { public void run() { doSomethingUseful(); } }, 0, 2, TimeUnit.MINUTES); 

Aquí es cómo ejecutar un hilo de repetición, como lo verá loops cada 1 segundo. No veo retraso con este método.

 final Thread t = new Thread(new RepeatingThread()); t.start(); 

Y la clase:

 import android.os.Handler; public class RepeatingThread implements Runnable { private final Handler mHandler = new Handler(); public RepeatingThread() { } @Override public void run() { mHandler.postDelayed(this, 1000); } } 

MyService.java

 public class MyService extends Service { public static final int notify = 5000; //interval between two services(Here Service run every 5 seconds) int count = 0; //number of times service is display private Handler mHandler = new Handler(); //run on another Thread to avoid crash private Timer mTimer = null; //timer handling @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { if (mTimer != null) // Cancel if already existed mTimer.cancel(); else mTimer = new Timer(); //recreate new mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify); //Schedule task } @Override public void onDestroy() { super.onDestroy(); mTimer.cancel(); //For Cancel Timer Toast.makeText(this, "Service is Destroyed", Toast.LENGTH_SHORT).show(); } //class TimeDisplay for handling task class TimeDisplay extends TimerTask { @Override public void run() { // run on another thread mHandler.post(new Runnable() { @Override public void run() { // display toast Toast.makeText(MyService.this, "Service is running", Toast.LENGTH_SHORT).show(); } }); } } } 

MainActivity.java

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(new Intent(this, MyService.class)); //start service which is MyService.java } } 

Agregue el siguiente código en AndroidManifest.xml

AndroidManifest.xml

 <service android:name=".MyService" android:enabled="true" android:exported="true"></service> 

Comenzar un runnable cada pocos segundos va a tener un cierto retraso no importa cómo usted lo corta, ¿no? No veo por qué un Handler no debe funcionar bien.

Usted podría estar experimentando algunos problemas, porque aunque usted tiene

 void startRepeatingTask() { m_handlerTask.run(); } 

En su lugar, debe utilizar el controlador y hacer algo como:

 void startRepeatingTask() { m_handler.post(m_handlerTask); } 

(Como un aparte, la convención en Java es usar el caso del camello, no el caso de la serpiente. Por lo tanto debe ser mHandler, no m_handler, el etc. apenas que le dice porque podría hacer su código más fácil de leer para alguno.

  • Tema de Android Simple Timer / Timertask
  • Cómo mostrar el temporizador en android
  • Temporizador de TextView de Android
  • ¿Cuál es el enfoque más eficiente en cuanto a la batería de usar LocationClient para recibir actualizaciones periódicamente?
  • Android Timer: postDelayed vs. schedule
  • Recibir un valor de cadena en MainActivity de SecondActivity y luego contarlo hacia abajo
  • Android: Alternativa de temporizador / retraso
  • Inicie el temporizador al hacer clic en el botón
  • Lanzar null pointerException en Timer.Schedule ();
  • Android: desea que la aplicación realice tareas cada segundo
  • Android: para medir el tiempo entre los dos clics de botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.