从Web加载ItemizedOverlays标记

时间:2012-11-05 14:26:45

标签: android android-mapview android-overlay

我想知道从网络加载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);
}
}

3 个答案:

答案 0 :(得分:1)

我建议您使用默认图像作为叠加绘图,而lazyLoader下载图像,将它们放入chache(两级缓存:内存和磁盘上),并在图像准备好后通知叠加层然后刷新它的观点。

答案 1 :(得分:1)

整体方法是正确的,但可以改进实施方法的细节。

Improvement 1

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

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

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

Improvement 2

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

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

问候。

答案 2 :(得分:0)

你可以尝试这种方式....查看链接..这是延迟加载图像的演示所以,这里第一次图像下载并将其缓存存储在SD卡中。所以,每次从网上加载标记都不需要花费更多时间。

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