您的位置:首页 > 理论基础 > 计算机网络

使用Glide加载网络图片,显示到高德地图的marker

2017-11-04 18:50 495 查看
使用Glide加载网络图片,显示到高德地图的marker,会遇到一些问题,下面将逐一讲解每个问题的解决方法

一、marker显示网络图片问题

问题:

使用Glide加载网络图片,显示到高德地图的marker上,会出现,有时候显示占位符,有时候显示正常的网络图片。网络图片是可以随时正常访问的。

分析:

1、marker 显示的是一个自定义的view A

2、显示maker的时候,Glide加载网络图片,显示到view A上,由于第一次去请求网络图片,没有立即返回。此时的view图片是占位符图片,AMap去添加了marker,把view A添加到了marker的BitmapDescriptor对象中,内存上这是两个不同的对象。所以glide加载完成后,更新view A,marker不会更新。

3、往往在第二次显示maker的时候,可以正常显示网络图片,因为Glide会缓存网络图片到内存,Glide加载网络图片,显示到view A上,由于在内存上有图片,立即返回。此时的view是网络图片,AMap去添加了marker,把view A添加到了marker的BitmapDescriptor对象中,显示正确。

解决方法:

使用SimpleTarget ,加载图片完成后,再添加marker

RequestBuilder lRequestBuilder = Glide.with(getApplication())
.asBitmap()
.load(deviceInfos.get(i).getHeadImage())
.apply(mOptions);


SimpleTarget locationTarget = new SimpleTarget<Bitmap>() {

@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
//iconview 就是自定义view,加载网络图片失败,显示占位符
iconView
.deviceAddressIcon
.setImageDrawable(getResources().getDrawable(R.drawable.device_icon));
addMarkers(true,index,iconView);
}

@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
//加载网络图片失败,显示网络图片
iconView.deviceAddressIcon.setImageBitmap(resource);
addMarkers(true,index,iconView);

}
};


最后调用into

lRequestBuilder.into(locationTarget);


二、使用SimpleTarget 加载网络图片,显示多个marker

问题:

只显示第一个maker,其他的maker显示不出来

分析:

如果是添加多个maker,这里的RequestBuilder和SimpleTarget 一定要是局部变量,否则会出现,只有第一个maker显示正确的网络图片,其他maker的显示不出来。

因为是SimpleTarget 的函数中添加maker,所以每添加一个maker就需要调用一次into,如果RequestBuilder和SimpleTarget是类变量,就是相同的对象,即使调用多次into,也只会执行SimpleTarget 的中函数一次。所以也就只会添加一个maker

解决办法:

把RequestBuilder和SimpleTarget声明为局部变量

三、多个maker,回调的问题

问题:

添加maker是为了在地图上,显示自定义的图片,因此需要经纬度和图片。

如果采用上面的回调方式,图片加载完成后去添加marker,图片是能正确显示了,由于这个是回调函数,是个内部类,在回调的时候并不能把经纬度传进去,如何获取这个maker的经纬度呢?

解决方法:

1、定义一个int i用来表示当前的marker,在生成SimpleTarget 回调的时候,把 i传递进去,这样就知道是第几个marker。

2、把所有的经纬度信息保存在数组list,使用 i作为索引

3、在执行SimpleTarget 中的回调函数时,就可以根据i来获取list中调用的经纬度

代码如下:

protected void drawMarker(List<DeviceInfo> deviceInfos) {

cleanMarkers();
if (null == deviceInfos || deviceInfos.size() <= 0) {
return;
}
int count = deviceInfos.size();
XLog.e("MainActivity", "marker的个数:" + count);
for (int i = 0; i < count; i++) {
mInt = i;
final int index = i;
DeviceAddressIconView iconView = new DeviceAddressIconView(this);
F LatLng = null;
RequestBuilder lRequestBuilder = Glide.with(getApplication()) .asBitmap() .load(deviceInfos.get(i).getHeadImage()) .apply(mOptions);
SimpleTarget locationTarget = new SimpleTarget<Bitmap>() {

@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
iconView.deviceAddressIcon.setImageDrawable(getResources().getDrawable(R.drawable.device_icon));
addMarkers(true,index,iconView);
}

@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
iconView.deviceAddressIcon.setImageBitmap(resource);
addMarkers(true,index,iconView);

}
};

SimpleTarget noLocationTarget = new SimpleTarget<Bitmap>() {

@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
super.onLoadFailed(errorDrawable);
iconView.deviceAddressIcon.setImageDrawable(getResources().getDrawable(R.drawable.device_icon));
addMarkers(false,0,iconView);
}

@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
iconView.deviceAddressIcon.setImageBitmap(resource);
addMarkers(false,0,iconView);

}
};
mLatLngList.add(index,getDeviceLocation(deviceInfos.get(i)));
lRequestBuilder.into(locationTarget);

}
}


四、添加marker数量多于设备的数量

问题:

碰到这业务,定位设备,把自己的定位信息传递到服务器,app获取服务器的设备信息,显示在地图上。

出现显示在地图上的设备个数(有的设备添加了多次到地图上,由于显示在地图上是重叠的,可能表面上看不出来),多于实际的设备个数

app是每隔一段时间,去获取一下这些设备信息。

分析:

见上面那段代码,在添加marker的时候,先清除掉之前的marker,但是如果生成RequestBuilder时,传入的context是当前activity的(如下代码),那么就会出现上面的问题。

RequestBuilder lRequestBuilder = Glide.with(this)
.asBitmap()
.load(deviceInfos.get(i).getHeadImage())
.apply(mOptions);


上面的代码,在地图界面不显示的时候,tagret回调是不执行,等待地图界面显示的时候,这个回调才会执行。如果多次从服务器获取数据,但是这时候界面没有显示出来,所以不会执行回调。这样就会积累很多次回调,等待界面显示,一下添加过多的marker。

解决办法:

见问题三的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐