我想知道从Web加载ItemizedOverlay标记的正确方法是什么,以某种方式使用缓存。
现在,我正在下载所有图像并将其转换为可绘制图像,效果很好,但是我想看看是否有更好的方法可以做到这一点。
public class ImageLoad extends AsyncTask<String, Bitmap, Bitmap> {
private String url;
private MapView mapView;
public ImageLoad() {
}
public ImageLoad(MapView mapView) {
this.mapView = mapView;
}
protected Bitmap doInBackground(String... params) {
url = params[0];
try {
return BitmapFactory.decodeStream(new URL(url).openConnection().getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
Drawable d = new BitmapDrawable(mapView.getContext().getResources(), result);
SimpleItemizedOverlay itemizedOverlay = new SimpleItemizedOverlay(d, mapView);
GeoPoint p = new GeoPoint(32061628, 34774767);
itemizedOverlay.addOverlay(new OverlayItem(p, "zzz", "zzz"));
mapView.getOverlays().add(itemizedOverlay);
mapView.invalidate();
super.onPostExecute(result);
}
}
最佳答案
总体方法是正确的,但是可以改进实现方法的细节。Improvement 1
每次下载图像时,都在onPostExecute()
中创建一个新的ItemizedOverlay
对象,并向其中添加单个项目。通常,使用唯一的ItemizedOverlay
并将所有项目添加到其中更有效。
创建ItemizedOverlay
并将其添加到MapView.getOverlays().add()
,然后再加载第一张图像
更改ImageLoad
类以接收ItemizedOverlay
而不是MapView
在onPostExecute()
中创建一个新的OverlayItem
并将其添加到ItemizedOverlay
这样,您只有一个ItemizedOverlay
,其中包含多个项目。使用您的代码,您将拥有多个ItemizedOverlays
,每个图像都有一个图像。Improvement 2
您没有调整您下载Web图像的大小。除非您确定它们均具有合适的尺寸,否则应在将其添加到叠加层之前强制执行该尺寸。否则,您将使用更多的内存,并且可能会得到覆盖整个屏幕的图像,这并不是用户期望的。
您可以使用方法Bitmap
调整Bitmap.createScaledBitmap()
的大小。
问候。