我正在使用Android谷歌地图v2,我正在创建地图标记并分配位图。我从资产目录中获取位图。我从资产中获取它们的原因是我用来查找“正确”图标的路径是动态的。
我的问题是我应该保存底层位图,以便我可以一次又一次地重复使用它。我读: http://developer.android.com/training/displaying-bitmaps/manage-memory.html
但坦率地说,很多大样本项目都在我头上。
每次我需要将其传递给用于创建的标记时,我是否应该重新创建位图,或者我应该将每个位图(最多限制)读入内存并保存以供重复使用。
无论如何我都不会在地图上绘制每个人。
示例:我在地图上有300个标记,有20个不同的可能位图。 I.E.大约15%是相同的标记图标。
答案 0 :(得分:4)
由于位图解码是非常昂贵的操作,我肯定会建议使用位图缓存。特别是在您的情况下,独特位图的数量远远小于地图上标记的数量。基于简单[LruCache][1]
的内存缓存可以正常工作。您只需要注意用于缓存的内存量。
以下是如何实现内存缓存的一个很好的示例: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
跟进
只是想到这一点,你可以在这里做得更好。您可以为您拥有的每个唯一位图缓存BitmapDescriptor
,而不是缓存位图。通过这种方式,您可以避免每次需要创建标记时调用BitmapDescriptorFactory
来获得额外的性能
<强>更新强>
这就是我的意思:
LruCache<String, BitmapDescriptor> cache;
private void initCache()
{
//Use 1/8 of available memory
cache = new LruCache<String, BitmapDescriptor>((int)(Runtime.getRuntime().maxMemory() / 1024 / 8));
}
private void addMarker(LatLng position, String assetPath)
{
MarkerOptions opts = new MarkerOptions();
opts.icon(getBitmapDescriptor(assetPath));
opts.position(position);
mMap.addMarker(opts);
}
private BitmapDescriptor getBitmapDescriptor(String path) {
BitmapDescriptor result = cache.get(path);
if (result == null) {
result = BitmapDescriptorFactory.fromAsset(path);
cache.put(path, result);
}
return result;
}