我试图通过在onStartMethod中使用同步Map来避免在服务上执行重复任务,然后检查是否尚未存储密钥。但是,到目前为止还没有工作,如果我打电话很快就启动服务两次就会执行两次相同的事情。
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 :(得分:0)
SYNCED_TABLES
的初始化不是线程安全的。因此,您可能会将多个对象分配给您锁定的此字段,即您有多个锁。
将SYNCED_TABLES
声明为final
字段并在其中初始化:
public class Foo {
final SYNCED_TABLES = Collections.synchronizedMap(new Hashtable<>());
}
这可以保证在对象的生命周期内只有一次锁定。