一个相当好的解决方案是将切片下载和缓存与 TileProvider 分开。这样您就可以完全控制何时下载它们,并且仅在下载全部后替换 byte[] 引用。
这可能有点复杂,因为您必须注意当前的可见区域并缩放而不是全部下载它们,而只下载那些可见的区域。
编辑
使用以下代码进行测试:
try {
InputStream is = getAssets().open("tile1.jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = is.read();
while (b != -1) {
baos.write(b);
b = is.read();
}
byte[] array = baos.toByteArray();
cache = new Tile(256, 256, array);
is = getAssets().open("tile2.jpg");
baos = new ByteArrayOutputStream();
b = is.read();
while (b != -1) {
baos.write(b);
b = is.read();
}
array = baos.toByteArray();
nextCache = new Tile(256, 256, array);
} catch (IOException ex) {
Log.e("tag", "error reading tiles", ex);
}
tileOverlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(new TileProvider() {
@Override
public Tile getTile(int x, int y, int zoom) {
return cache;
}
}));
稍后的某个地方:
Tile temp = cache;
cache = nextCache;
nextCache = temp;
tileOverlay.clearTileCache();
“最快”的可能代码仍然失败。
如果您无法切换到 GroundOverlay 或 Markers,另一个想法是尝试使用第三方地图图块,即您当前的天气图块上方和下一个图块,以便他们可以在几秒钟后加载和切换它们(使用 zOrder)。