2017-02-15 8 views
0

Я пытаюсь избежать выполнения повторяющихся задач в службе с помощью синхронизированной карты в onStartMethod, а затем проверять, что ключ еще не сохранен. Однако до сих пор он не работает, он выполняет одно и то же дважды, если я позвоню в начале службы дважды.Синхронизированная карта в службе 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

Почему бы просто не использовать IntentService? – Submersed

+0

Работа, выполняемая в обработчике потоков, представляет собой запрос на отправку на сервер. Мы хотим сделать запросы многопоточными (существует несколько разных баз данных) – Julio

ответ

0

Инициализация SYNCED_TABLES не является потокобезопасной. В результате вы рискуете иметь несколько объектов, назначенных этому полю, на котором вы блокируете, т. Е. У вас есть несколько блокировок.

Declare SYNCED_TABLES как final поле и инициализировать его прямо там:

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

Это гарантирует, что у вас есть один замок в течение срока службы объекта.

+0

Это работает, но после того, как Служба мертва, снова создается ли экземпляр карты? Потому что я попробовал снова запустить службу через несколько минут, и она не выполнялась, потому что старые значения все еще сохранялись. – Julio

+0

Для удаления коллекции существует https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#clear(). Вы можете называть это в 'onCreate()', если это соответствует вашим потребностям. – aha

+0

Спасибо, сейчас работает – Julio

Смежные вопросы