2017-02-15 2 views
0

J'essaie d'éviter d'exécuter des tâches en double sur un Service en utilisant une Map synchronisée dans onStartMethod, puis en vérifiant qu'une clé n'est pas déjà stockée. Cependant, jusqu'ici ne fonctionne pas, il exécute la même chose deux fois si j'appelle démarrer le service deux fois assez tôt.Mappage synchronisé dans le service onStartCommand

public void onCreate() { 
      SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>()); 
} 
public int onStartCommand(Intent intent, int flags, int startId) { 
      synchronized (SYNCED_TABLES){ 
       if(!SYNCED_TABLES.containsKey(intent.getStringExtra(KEY))){ 
        SYNCED_TABLES.put(intent.getStringExtra(KEY), true); 
        /* Do stuff on a Handler thread */ 
       } 
       else{ 
        Log.d(TAG, "Tried to execute the same task twice " + intent.getStringExtra(KEY)); 
       } 
      } 

} 
+0

Pourquoi ne pas simplement utiliser un IntentService? – Submersed

+0

Le travail effectué dans le gestionnaire de thread est une demande de publication sur un serveur. Nous voulons faire les demandes multithread (il y a plusieurs bases de données différentes) – Julio

Répondre

0

L'initialisation de SYNCED_TABLES n'est pas adaptée aux threads. En conséquence, vous risquez d'avoir plusieurs objets assignés à ce champ sur lequel vous verrouillez, c'est-à-dire que vous avez plusieurs verrous.

Declare SYNCED_TABLES comme un champ final et l'initialiser là:

public class Foo { 
    final SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>()); 
} 

Cela garantit que vous avez un seul verrou sur la durée de vie de votre objet.

+0

Cela fonctionne, mais, après que le service soit mort, la carte est instanciée à nouveau? Parce que j'ai juste essayé de relancer le service après quelques minutes et il ne s'est pas exécuté parce que les anciennes valeurs étaient encore stockées. – Julio

+0

https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#clear() pour vider la collection. Vous pouvez l'appeler dans 'onCreate()' si cela correspond à vos besoins. – aha

+0

Merci, ça marche maintenant – Julio