我想实现一个具备以下功能的TileProvider:
然而,这只会在内存中缓存它,所以如果用户关闭我的应用程序,它就不会被缓存了,在下载
我该如何解决这个问题?有没有办法做到我想做的事情?为什么
Map
请求Tile
TileProvider
检查所需的Tile
是否可以离线使用- 如果可以,TileProvider 返回该
Tile
- 无论是否可用,
TileProvider
都会在线上检查新 Tile 并将其下载到外部存储器中的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;
}
}
}
然而,这只会在内存中缓存它,所以如果用户关闭我的应用程序,它就不会被缓存了,在下载
Tiles
之前,将显示默认的谷歌地图。
UrlTileProvider
将 getTile
实现为 final
,因此我无法重写它。 TileProvider
没有 getTileURL
方法,而且我无法获得 UrlTileProvider
的源代码来重新编写解决方案。我该如何解决这个问题?有没有办法做到我想做的事情?为什么
getTile
是 final 的?我有什么遗漏的吗?