我想知道从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()的大小。

问候。

10-04 19:34