Android 从web加载ItemizedOverlays标记

Android 从web加载ItemizedOverlays标记,android,android-mapview,android-overlay,Android,Android Mapview,Android Overlay,我想知道从web加载ItemizeOverlay标记的正确方法是什么,以某种方式使用缓存 现在我正在下载所有的图片,并将它们转换为可绘制的,它工作得很好,但我想看看是否有更好的方法来做到这一点 public class ImageLoad extends AsyncTask<String, Bitmap, Bitmap> { private String url; private MapView mapView; public ImageLoad() { } public Ima

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

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

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);
}
}
公共类ImageLoad扩展异步任务{
私有字符串url;
私有地图视图;
公共图像加载(){
}
公共图像加载(MapView MapView){
this.mapView=mapView;
}
受保护位图doInBackground(字符串…参数){
url=params[0];
试一试{
返回BitmapFactory.decodeStream(新URL.openConnection().getInputStream());
}捕获(格式错误){
e、 printStackTrace();
返回null;
}捕获(IOE异常){
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onPostExecute(位图结果){
Drawable d=新的BitmapDrawable(mapView.getContext().getResources(),结果);
SimpleItemizedOverlay=新SimpleItemizedOverlay(d,地图视图);
地质点p=新的地质点(32061628、34774767);
添加覆盖(新覆盖项(p,“zzz”,“zzz”));
mapView.getOverlays().add(ItemizeOverlay);
mapView.invalidate();
super.onPostExecute(结果);
}
}

我建议您在lazyLoader下载图像并将其放入chache(两级缓存:内存和磁盘)时,使用默认图像作为可绘制的覆盖,并在图像准备就绪时通知覆盖,然后由覆盖刷新其视图。

您可以尝试这种方式……请参阅链接。.这是延迟加载图像的演示,因此,这里首次下载图像并将其缓存存储在SD卡中。所以,每次从web加载标记并不需要更多的时间


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

改进1

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

  • 在加载第一个图像之前,创建
    ItemizedOverlay
    并将其添加到
    MapView.getOverlays().add()
  • ImageLoad
    类更改为接收
    ItemizedOverlay
    而不是
    MapView
  • onPostExecute()
    中创建一个新的
    OverlayItem
    并将其添加到
    ItemizedOverlay
这样,您将只有一个
ItemizedOverlay
,其中包含多个项目。使用您的代码,您有几个
项目化的overlays
,每个都有一个图像

改进2

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

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


问候。

我想先加载所有图像,然后再显示所有覆盖图。在添加到地图后,是否有任何方法来更改项目覆盖图的可绘制性?我认为您的方法是正确的。getOverlays还允许访问覆盖列表并对其进行更改。public final java.util.List getOverlays()使用此选项,您可以执行删除和读取覆盖项之类的操作。因此,我需要先下载图像,填充ItemizeOverlay,然后返回它,如果它不是空的,则将其添加到覆盖列表中?否。您可以在开始下载图像之前将ItemizeOverlay添加到覆盖列表中,即使它是空的。这应该只做一次,而不是每次你下载一个额外的图像。或者,您只能在添加第一个图像后再添加,但不能再添加。新图像将添加到已存在的ItemizeOverlay中。我已经编辑了我的答案,使其更加清晰。在使用它之前,您需要调用
itemizedOverlay上的
populate()
,即使它是空的。这就解决了空指针的问题。无论如何,您可以在添加第一个项(您可能正在调用填充的方法)之后添加它,正如我前面所说。每个itemizedoverlay只有一个标记的图像(可绘制)实例,我不能在添加标记后更改标记,对吗?或者我可以在itemizedoverlay启动后设置标记吗?您指定给itemizedoverlay的图像是默认图像,据我所知,您不能(或不应该)更改它。但是,可以使用方法
setMarker()
为添加到
ItemizedOverlay
的对象“OverlayItem”分配自己的图像(如果没有图像分配给它,则使用
ItemizedOverlay
中的默认值)。因此,下载图像后,创建
OverlayItem
,使用
setMarker()
将图像分配给项目,然后将项目添加到“ItemizedOverlay”。