I have an app that use android-maps-utils and glide for marker icons.
I got an error report using Firebase crash reporting which I can\'t track in source code because
Make sure the icon that you are using for marker should not be vector,it should be .png image.
This exception happens when your marker was reclustered by ClusterManager
. ClusterManager
recreates marker on clustering.
So, to avoid it you must get your marker from render of ClusterManeger
:
ClusterIconRender render = (ClusterIconRender) mClusterManager.getRenderer();
Marker trueMarker = render.getMarker(clusterMarker);
if (trueMarker != null) {
trueMarker.setIcon(...);
... // do whatever else your want with marker
}
In code above ClusterMarker
implements ClusterItem
and ClusterIconRender
extends DefaultClusterRenderer
.
I found this happening when accessing marker after it was removed. Interacting with marker in callback is exactly that case. As mentioned in Map's API:
After a marker has been removed, the behavior of all its methods is undefined. https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#remove()
Best option would be checking is marker removed from map or not.
But we don't have such API. And I found another workaround, we can use Marker's setTag
and getTag
. Tag is set to null, when marker is removed:
Google Maps Android API neither reads nor writes this property, except that when a marker is removed from the map, this property is set to null. https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#setTag(java.lang.Object)
When creating marker use some tag for it.
When updating marker check tag is not null.
This could help in your case.
@Override
protected void onClusterItemRendered(Sucursal clusterItem, Marker marker) {
// we don't care about tag's type so don't reset original one
if (marker.getTag() == null) {
marker.setTag("anything");
}
CustomSimpleTarget simpleTarget = new CustomSimpleTarget();
simpleTarget.sucursal = clusterItem;
simpleTarget.markerToChange = marker;
ImageLoaderManager.setImageFromId(simpleTarget, clusterItem.logo, mContext);
}
And in callback
private class CustomSimpleTarget extends SimpleTarget<GlideDrawable> {
...
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
...
// if found - change icon
if (markerToChange != null) {
//GlideShortcutDrawable is a WeakReference<>(drawable)
sucursal.setGlideShortCutDrawable(resource);
if (markerToChange.getTag != null) {
markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
}
}
}
}
I fixed it by calling the following method.
clusterManager.clearItems()
After that, you can set bitmap to the markers.
Marker centerPoint
when you do that: centerPoint.remove();
And then you do it again :
marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
It throws an error :
Unmanaged descriptor
You should
centerPoint.remove();
centerPoint=null;
Try
mClusterManager.markerCollection.clear();
mMap.clear()