1

J'utilise Java executorservice pour créer un effet de délai dans l'une de mes applications. Après un temps écoulé, le service d'exécution commence et déconnecte l'utilisateur de sa session. Mais sur un appareil Android lorsque l'appareil se met en veille, le thread exécuteur est suspendu. Après que l'appareil se soit éveillé, le fil n'est pas suspendu. Je voudrais changer l'horloge que l'exécuteur utilise pour qu'il continue à compter même après que l'appareil passe en mode veille prolongée. Je ne peux pas sur piloter quelle horloge est utilisée (je réalise que je peux changer toute l'implémentation et utiliser alarmmanager mais je ne cherche pas à modifier le code existant à ce stade, donc n'essayez pas d'offrir d'autres API). Ma question est, il doit y avoir une horloge système qui continue malgré le fait que l'appareil est endormi, comment puis-je laisser le executor scheduler utiliser cette horloge à la place de celle qu'il utilise maintenant, qui respecte l'appareil qui dort profondément et pauses ticking ?ExecutorService comment changer l'horloge de planification

Mon code J'est actuellement très simple et ressemble à ceci:

myExecutorService.schedule(new EndUserSession(), 
         6L, TimeUnit.MINUTES); 

ce code commence au-dessus du EndUserSession() en 6 minutes. Cela fonctionne mais je veux utiliser une autre horloge qui ne respecte pas le temps de l'appareil mobile.

Répondre

2

Je doute fortement qu'il soit possible d'influencer les mécanismes de synchronisation du service du planificateur.

Vous disposez d'une autre option pour éviter les problèmes causés par la mise en veille du périphérique, comme le passage d'un horodatage spécifique dans le constructeur et la planification d'une tâche à un débit fixe. Exemple:

class EndSessionTask { 

    final long sessionExpirationTime; 
    volatile ScheduledFuture future; 

    public EndSessionTask(long ts) { sessionExpirationTime = ts; } 

    public void run() { 
     if (sessionExpirationTime < currentTs) return; 
     endSession(); 
     future.cancel(); 
    } 

    public void setFuture(ScheduledFuture f) { this.future = f; } 
} 

long endSessionTime = System.currentTimeMillis() + 6 * 60 * 1000; 
EndSessionTask task = new EndSessionTask(endSessionTime); 
ScheduledFuture future = executorService.scheduleAtFixedRate(task, 10L, 10L, SECONDS); 
task.setFuture(future); 
+0

Pouvez-vous expliquer la logique 10L. Si pas clair comment cela aide. L'appareil peut aller dormir et votre emploi du temps va geler. Quand il se réveille, il continue quand il a été arrêté – j2emanue

+0

@ j2emanue L'idée est de vérifier si la session a expiré toutes les 10 secondes. Si l'appareil dort pendant une heure, la tâche se déclenchera dans les 10 secondes suivant le réveil. Il remarquera que l'heure d'expiration est déjà passée et tue la session. Ensuite, il annulera la tâche planifiée. – AdamSkywalker