Android gestisce il thread in servizio each X secondi

Voglio creare un thread in un servizio Android che viene eseguito each X secondi

Attualmente sto usando, ma il metodo successivo sembra veramente ritardare la mia applicazione.

  • Emulatore Android: Imansible get l'errore wglGetExtensionsStringARB
  • Come mostrare le icone nel menu di overflow di ActionBar?
  • salvare l'image in SQLITE?
  • Come generare diversi tipi di report utilizzando il database SQLite in android?
  • FLAG_ACTIVITY_CLEAR_TOP?
  • Nascondi field Anno in Android DatePicker?
  • @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(); } 

    Voglio fare un nuovo thread come questo:

      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); } 

    Non sono sicuro che il modo migliore per fare un thread di background per eseguire ad un certo intervallo, apprezzato l'intuizione!

  • Come si può rilevare l'avvio di un'applicazione Android?
  • API Google MAPS per Android limita 2500 richieste / giorno è per dispositivo client o per chiave di applicazione?
  • Come posso trovare i server DNS in Android da un programma Java?
  • Android - Riproduzione mp3 da byte
  • Come scrivere shell shell adb in java.lang.Runtime.getRuntime ()?
  • get informazioni dal database sqlite
  • 4 Solutions collect form web for “Android gestisce il thread in servizio each X secondi”

    Ci sono diversi modi alternativi per farlo. Personalmente preferisco usare 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); 

    Ecco come eseguire un thread ripetuto, come vedrai loop each 1 secondo. Non vedo ritardi con questo metodo.

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

    E la class:

     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 } } 

    Aggiungi il codice riportto di seguito in AndroidManifest.xml

    AndroidManifest.xml

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

    Avviare un runnable each pochi secondi avrà qualche ritardo a prescindere dal modo in cui lo fai, no? Non capisco perché un Handler non dovrebbe funzionare bene.

    Potresti sperimentare alcuni problemi però perché avete

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

    Invece, dovresti usare il gestore e fare qualcosa di simile:

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

    (Da parte sua, la convenzione in Java è quella di utilizzare il caso di cammelli, non il caso di serpente, quindi dovrebbe essere mHandler, non m_handler, ecc. Ti dico solo perché potrebbe rendere il codice più facile da leggere per alcuni.)

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.