【发布时间】:2013-05-22 08:36:42
【问题描述】:
我想用这个功能实现一个 TileProvider:
-
Map要求Tile - TileProvider 检查上述
Tile是否可以离线使用 - 如果是这样,TileProvider 会返回说
Tile - 无论可用性如何,
TileProvider都会在线检查新磁贴并将其下载到外部存储中的Cache。 -
TileProvider为地图提供新的 Tile,然后地图更新它。
这是我当前的UrlTileProvider 实现:
public class MapBoxOnlineTileProvider extends UrlTileProvider {
private static final String[] FORMATS;
static {
final String[] servers = new String[] { "a", "b", "c", "d" };
final String[] formats = new String[servers.length];
for (int i = 0; i < servers.length; i++) {
formats[i] = String.format(
"%%s://%s.tiles.mapbox.com/v3/%%s/%%d/%%d/%%d.png",
servers[i]);
}
FORMATS = formats;
}
// ------------------------------------------------------------------------
// Instance Variables
// ------------------------------------------------------------------------
private String mMapIdentifier;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
public MapBoxOnlineTileProvider(final String mapIdentifier) {
super(256, 256);
this.mMapIdentifier = mapIdentifier;
}
// ------------------------------------------------------------------------
// Public Methods
// ------------------------------------------------------------------------
public String getMapIdentifier() {
return this.mMapIdentifier;
}
public void setMapIdentifier(final String anIdentifier) {
this.mMapIdentifier = anIdentifier;
}
@Override
public URL getTileUrl(final int x, final int y, final int z) {
final String f = FORMATS[new Random().nextInt(FORMATS.length)];
final String p = "http";
try {
return new URL(String.format(f, p, this.mMapIdentifier, z, x, y));
} catch (final MalformedURLException e) {
e.printStackTrace();
return null;
}
}
}
但是,这只会将其缓存在内存中,因此如果用户关闭我的应用程序,它不会缓存它们,并且默认的 Google Maps 地图将在下载 Tiles 之前出现。
UrlTileProvider 将getTile 实现为final,所以我无法覆盖它。 TileProvider 没有getTileURL 方法,并且UrlTileProvider 源代码不可供我重写我的解决方案。
我应该如何处理这个问题?有什么办法可以做我想做的事吗?为什么getTile 是最终的?我错过了什么吗?
【问题讨论】:
标签: android caching google-maps-android-api-2 mapbox