应该缓存getSystemService(...)结果吗?

时间:2012-05-15 18:50:37

标签: android

getSystemService的文档建议不要在不同的上下文之间共享服务对象

对于单个上下文,是否最好通过将服务对象分配给onCreate()中的实例字段来缓存服务对象,还是应该在使用时获取?什么是惯用法?

2 个答案:

答案 0 :(得分:7)

由于持有系统服务对象的成本非常低,我建议在数据成员中保留它。无论您是onCreate()还是懒惰,如果/需要,您都可以根据需要进行初始化。

请注意,使用系统服务对象可能会产生很高的成本。持有LocationManager实例很便宜;使用GPS(例如,通过requestLocationUpdates())并不便宜。

答案 1 :(得分:0)

我正要问同样的问题。这是我如何做到的 - 在服务中(继承自Context)

private static volatile LocationManager lm; // not final - we need a context

private LocationManager lm() {
    LocationManager result = lm;
    if (result == null) {
        synchronized (LocationMonitor.class) { // my service
            result = lm;
            if (result == null)
                result = lm = (LocationManager)
                    getSystemService(Context.LOCATION_SERVICE);
        }
    }
    return result;
}