2017-08-28 3 views
0

J'ai lu de nombreux articles mais je ne trouve pas de réponse à ma question spécifique.Minuterie Android en service - comment arrêter et démarrer

Le service ci-dessous fonctionne bien. Je peux le démarrer. Il commence. Je peux l'arrêter. Ça s'arrête. Je peux le redémarrer avec un nouvel intervalle. Cela fonctionne aussi. Quand je l'arrête, ça ne s'arrêtera pas. Dans onDestroy, il s'agit du cas timer = null. Si j'insère timer.cancel dans onDestroy dans le cas timer = null, je reçois un crash pour agir sur un pointeur nul. Pourtant, il fonctionne toujours comme illustré par la sortie du journal!

Voici la sortie du journal si utile (après la dernière "noOutRows" il ne cesse en marche)

E/ timer: startservice 
E/ timer: timeInterval 1000 
E/ timer: isNotNull 
E/ timer: no noOutRows 1503945704743 
E/ timer: no noOutRows 1503945705712 
E/ timer: no noOutRows 1503945706714 
E/ timer: no noOutRows 1503945707713 
E/ timer: no noOutRows 1503945708712 
E/ timer: stopservice 
E/ timer: stop - isNotNull 
E/ timer: startservice 
E/ timer: timeInterval 5000 
E/ timer: isNull 
E/ timer: no noOutRows 1503945744406 
E/ timer: no noOutRows 1503945749407 
E/ timer: no noOutRows 1503945754407 
E/ timer: stopservice 
E/ timer: stop - isNull 
E/ timer: no noOutRows 1503945759407 
E/ timer: no noOutRows 1503945764407 
E/ timer: no noOutRows 1503945769773 

Voici mon code

public class LocalService extends Service 
{ 
    public Integer timeInterval = 1000; 
    private static Timer timer = new Timer(); 
    public IBinder onBind(Intent arg0) 
    { 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e(" timer"," startservice"); 
     int newTimeInterval = intent.getIntExtra("time_interval", -99); 
      timeInterval = newTimeInterval; 
      Log.e(" timer ", " timeInterval " + timeInterval); 
      if (timer == null){ 
       Log.e(" timer"," isNull"); 
       Timer timer = new Timer(); 
       timer.scheduleAtFixedRate(new mainTask(), 0, timeInterval); 
      } else { 
       Log.e(" timer"," isNotNull"); 
       timer.scheduleAtFixedRate(new mainTask(), 0, timeInterval); 
      } 
     return START_STICKY; 
    } 
    private class mainTask extends TimerTask 
    { 
     public void run() 
     { 
      logHandler.sendEmptyMessage(0); 
     } 
    } 
    public void onDestroy() 
    { 
     Log.e(" timer"," stopservice"); 
     if (timer != null) { 
      Log.e(" timer"," stop - isNotNull"); 
      timer.cancel(); 
      timer = null; 
     } else { 
      Log.e(" timer"," stop - isNull"); 
     } 
     super.onDestroy(); 
    } 
    private final Handler logHandler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      int maxRows = MainActivity.Cache.alls.size()-1; 
      if (maxRows > 0) { 
       Log.e(" timer ", " outRows " + maxRows + " " + MainActivity.Cache.alls.get(maxRows).toString()); 
      } else { 
       Log.e(" timer ", " no noOutRows " + MainActivity.utcNow().getTime()); 
      } 
     } 
    }; 
} 
+0

est-il pas attendu? https://stackoverflow.com/q/9093271/1531971 – jdv

+0

Merci. Bonne question. Je ne suis pas très familier avec START_STICKY. Cependant, je vais essayer l'approche Runnable ci-dessous. –

Répondre

0

Pour une raison quelconque, je don Rappelez-vous que tout le monde a accepté de ne pas utiliser Timers dans Android, ils sont allés pour le combo Runnable/Handler. Il va comme ceci

private static final int delay = 1000; 
private final Handler handler = new Handler(); 

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     yourAdvancedScheduledLogic();//pre or post as you wish 
     if(!yourExitCondition()) { 
      handler.postDelayed(this, delay); 
     } 
    } 
}; 

et

runnable.run();//stars the timer 
+0

Merci. J'ai créé une classe et j'ai mis le code dessus. Maintenant j'ai juste besoin de gérer le démarrage/arrêt et passer la valeur du délai. –