我想知道从网络加载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);
}
}
答案 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卡中。所以,每次从网上加载标记都不需要花费更多时间。