当前位置: 代码迷 >> Android >> onStartCommand服务中的同步映射
  详细解决方案

onStartCommand服务中的同步映射

热度:84   发布时间:2023-08-04 11:19:15.0

我试图通过在onStartMethod中使用同步Map来避免在Service上执行重复任务,然后检查密钥是否尚未存储。 但是,到目前为止,它仍然无法正常工作,如果我两次足够快地调用一次启动服务,它将执行两次相同的操作。

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));
                }
            }

}

SYNCED_TABLES的初始化不是线程安全的。 因此,您有将多个对象分配给要锁定的该字段的风险,即您拥有多个锁。

SYNCED_TABLES声明为final字段,然后在此处将其初始化:

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

这样可以确保您在对象的生命周期内只有一个锁。