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

使用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。

解决办法:

见问题三的代码

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

展开阅读全文
©️2020 CSDN 皮肤主题: 撸撸猫 设计师: 设计师小姐姐 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值