1

我想知道从网络加载 ItemizedOverlay 标记的正确方法是什么,以某种方式使用缓存。

现在我正在下载所有图像并将它们转换为drawables,它工作得很好,但我想看看是否有更好的方法来做到这一点。

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);
}
}
4

3 回答 3

1

我建议您在lazyLoader 下载图像时使用默认图像作为可绘制的叠加层,将它们放入缓存中(二级缓存:在内存中和磁盘上)并在图像准备好时通知叠加层,然后谁刷新它的视图.

于 2012-11-05T14:40:50.357 回答
1

总体方法是正确的,但是您如何实现它的细节可以改进。

Improvement 1

在您onPostExecute()每次下载图像时,您都在创建一个新ItemizedOverlay对象并向其中添加一个项目。通常,使用唯一的ItemizedOverlay并将所有项目添加到其中会更有效。

  • 在加载第一个图像之前创建ItemizedOverlay并添加它MapView.getOverlays().add()
  • 更改ImageLoad类以接收ItemizedOverlay而不是MapView
  • onPostExecute()创建一个新的OverlayItem并将其添加到ItemizedOverlay

有了这个,您将只有一个ItemizedOverlay包含多个项目。使用您的代码,您有几个ItemizedOverlays,每个都有一个图像。

Improvement 2

您没有调整从 Web 下载的图像的大小。除非您确定它们都具有合适的大小,否则您应该在将它们添加到叠加层之前强制执行该大小。否则,您将使用更多内存,并且可能会获得覆盖所有屏幕的图像,这不是用户期望的。

您可以调整Bitmap使用方法的大小Bitmap.createScaledBitmap()

问候。

于 2012-11-13T10:28:04.340 回答
0

您可以尝试这种方式..查看链接..这是延迟加载图像的演示所以,这里是第一次下载图像并将其缓存存储在 sdcard 中。因此,每次从 Web 加载标记都不会花费更多时间。

http://developand.blogspot.in/2010/11/lazy-loading.html

于 2012-11-09T10:14:00.927 回答