使用Glide加载网络图片,显示到高德地图的marker
2017-11-04 18:50
495 查看
使用Glide加载网络图片,显示到高德地图的marker,会遇到一些问题,下面将逐一讲解每个问题的解决方法
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对象中,显示正确。
最后调用into
因为是SimpleTarget 的函数中添加maker,所以每添加一个maker就需要调用一次into,如果RequestBuilder和SimpleTarget是类变量,就是相同的对象,即使调用多次into,也只会执行SimpleTarget 的中函数一次。所以也就只会添加一个maker
如果采用上面的回调方式,图片加载完成后去添加marker,图片是能正确显示了,由于这个是回调函数,是个内部类,在回调的时候并不能把经纬度传进去,如何获取这个maker的经纬度呢?
2、把所有的经纬度信息保存在数组list,使用 i作为索引
3、在执行SimpleTarget 中的回调函数时,就可以根据i来获取list中调用的经纬度
代码如下:
出现显示在地图上的设备个数(有的设备添加了多次到地图上,由于显示在地图上是重叠的,可能表面上看不出来),多于实际的设备个数
app是每隔一段时间,去获取一下这些设备信息。
上面的代码,在地图界面不显示的时候,tagret回调是不执行,等待地图界面显示的时候,这个回调才会执行。如果多次从服务器获取数据,但是这时候界面没有显示出来,所以不会执行回调。这样就会积累很多次回调,等待界面显示,一下添加过多的marker。
一、marker显示网络图片问题
问题:
使用Glide加载网络图片,显示到高德地图的marker上,会出现,有时候显示占位符,有时候显示正常的网络图片。网络图片是可以随时正常访问的。分析:
1、marker 显示的是一个自定义的view A2、显示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 ,加载图片完成后,再添加markerRequestBuilder 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。
解决办法:
见问题三的代码相关文章推荐
- Android----高德地图多个Marker加载网络图片出现图片不显示问题
- 使用OkhttpUtils作为网络框架同时,使用Glide加载Https图片
- 使用Glide加载网络图片,使用photoView进行缩放
- 解决Glide加载网络圆角图片先显示完整图片的问题
- Glide加载网络图片,显示之前的URL图片,换了URL图片还是没变的问题
- Android网络加载图片universal-image-loader的工具类以及Glide使用
- Glide使用 加载网络图片 圆形图片 圆角图片
- 当图片URL为404时,使用Glide加载图片,修改用户头像无法显示最新图片bug
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- 使用第三方框架Glide显示网络图片
- Android 使用Glide加载网络图片等比例缩放的实现方法
- 解决Glide加载网络圆角图片先显示完整图片的问题
- Android 流行的网络图片加载库 之 使用 Glide 加载图片 (Google推荐的图片加载库Glide)
- 使用Kotlin进行网络请求+Glide加载图片
- 解决Glide加载网络圆角图片先显示完整图片的问题
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- 使用glide图片加载框架将网络图片展示并在listview中
- 关于高德地图,自定义Marker使用自己的XMl,Fresco加载图片流程
- Android Glide网络图片加载类库使用详解
- Glide加载网络图片, 显示的还是以前的图片! (最全解决方案!)