IllegalArgumentException: Nicht verwalteter Deskriptor mit gms.maps.model.Marker.setIcon

Lesezeit: 15 Minuten

Benutzer-Avatar
MiguelHincapieC

Ich habe eine App, die verwendet android-maps-utils und Gleiten Sie für Markierungssymbole.
Ich habe einen Fehlerbericht mit Firebase-Absturzberichten erhalten, den ich im Quellcode nicht verfolgen kann, weil gms.maps.model.Marker.setIcon ist privat, also bitte ich um Hilfe bei diesem Problem.
Der folgende Teil der Frage ist unterteilt in:

  • Was der Benutzer getan hat
  • Was Firebase Crash mir gemeldet hat
  • Einige Projektkonfigurationen
  • Was ich versucht/gefunden habe, um es zu verstehen/beheben

Was der Benutzer getan hat

Er zoomte in eine Karte hinein und heraus (Fragment das nutzt com.google.android.gms.maps.SupportMapFragment)

Was Firebase Crash mir gemeldet hat

Ausnahme java.lang.IllegalArgumentException: Nicht verwalteter Deskriptor
com.google.maps.api.android.lib6.common.kb (:com.google.android.gms.DynamiteModulesB:162)
com.google.maps.api.android.lib6.impl.oc (:com.google.android.gms.DynamiteModulesB:75)
com.google.maps.api.android.lib6.impl.db.a (:com.google.android.gms.DynamiteModulesB:334)
com.google.android.gms.maps.model.internal.q.onTransact (:com.google.android.gms.DynamiteModulesB:204)
android.os.Binder.transact (Binder.java:387)
com.google.android.gms.maps.model.internal.zzf$zza$zza.zzL () com.google.android.gms.maps.model.Marker.setIcon ()
co.com.spyspot.ui.content.sucursal.SucursalRender$CustomSimpleTarget.onResourceReady (SucursalRender.java:156)
co.com.spyspot.ui.content.sucursal.SucursalRender$CustomSimpleTarget.onResourceReady (SucursalRender.java:130)
com.bumptech.glide.request.GenericRequest.onResourceReady (GenericRequest.java:525)
com.bumptech.glide.request.GenericRequest.onResourceReady (GenericRequest.java:507)
com.bumptech.glide.load.engine.EngineJob.handleResultOnMainThread (EngineJob.java:158)
com.bumptech.glide.load.engine.EngineJob.access$100 (EngineJob.java:22)
com.bumptech.glide.load.engine.EngineJob$MainThreadCallback.handleMessage (EngineJob.java:202)
android.os.Handler.dispatchMessage (Handler.java:98)
android.os.Looper.loop (Looper.java:148)
android.app.ActivityThread.main (ActivityThread.java:5443)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:728)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

Und:

Geben Sie hier die Bildbeschreibung ein

Einige Projektkonfigurationen

  • Ich verwende ein benutzerdefiniertes Rendering (SucursalRender extends DefaultClusterRenderer<Sucursal>)
  • Ich lade das Marker-Symbol mit Glide herunter, wie ich bereits sagte: Glide.with(context).load(id).fitCenter().placeholder(R.drawable.ic_no_image).into(simpleTarget);

Das simpleTarget Hier handhabe ich die für Glide heruntergeladenen/zwischengespeicherten Bilder. Ich poste den gesamten Code über simpleTarget weil der Absturz dort beginnt:

private class CustomSimpleTarget extends SimpleTarget<GlideDrawable> {
    Sucursal sucursal;
    Marker markerToChange = null;

    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
        mImageView.setImageDrawable(resource);
        //currentSelectedItem is the current element selected in the map (Sucursal type)
        //mIconGenerator is a: CustomIconGenerator extends IconGenerator
        if (currentSelectedItem != null && sucursal.idalmacen.contentEquals(currentSelectedItem.idalmacen))
            mIconGenerator.customIconBackground.useSelectionColor(true, ContextCompat.getColor(mContext, R.color.colorAccent));
        else
            mIconGenerator.customIconBackground.useSelectionColor(false, 0);

        Bitmap icon = mIconGenerator.makeIcon();

        if (markerToChange == null) {
            for (Marker marker : mClusterManager.getMarkerCollection().getMarkers()) {
                if (marker.getPosition().equals(sucursal.getPosition())) {
                    markerToChange = marker;
                }
            }
        }

        // if found - change icon
        if (markerToChange != null) {
            //GlideShortcutDrawable is a WeakReference<>(drawable)
            sucursal.setGlideShortCutDrawable(resource);
            markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
        }
    }
}

Das Absturz wird in die letzte Codezeile geworfen: markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));

Was ich versucht/gefunden habe, um es zu verstehen/beheben

  • Habe versucht den Fehler bei 4 realen Geräten zu reproduzieren ohne Erfolg.
  • Im Web nach ähnlichen Fehlern oder Code gesucht gms.maps.model.Marker.setIcon oder com.google.maps.api.android.lib6
  • Versucht, den in Android Studio angegebenen verschleierten Code zu verstehen Marker.setIcon

Ich denke, ich kann den Code in a packen try-catch block für diese IllegalArgumentException: Nicht verwalteter Deskriptor, um zu vermeiden, dass die Anwendung wegen des Absturzes geschlossen wird, aber es ist nur eine Umgehung.

aktualisieren 2

Der Code von DefaultClusterRenderer:

public class SucursalRender extends DefaultClusterRenderer<Sucursal> {
    /**
     * Create a customized icon for markers with two background colors. Used with {@link com.google.maps.android.clustering.ClusterItem}.
     */
    private final CustomIconGenerator mIconGenerator;
    /**
     * Marker image.
     */
    private final ImageView mImageView;
    /**
     * Create a customized icon for {@link Cluster<Sucursal>} with a single background.
     */
    private final IconGenerator mClusterIconGenerator;
    /**
     * Cluster image.
     */
    private final ImageView mClusterImageView;
    private final Context mContext;
    /**
     * Keep a reference to the current item highlighted in UI (the one with different background).
     */
    public Sucursal currentSelectedItem;
    /**
     * The {@link ClusterManager<Sucursal>} instance.
     */
    private ClusterManager<Sucursal> mClusterManager;

    public SucursalRender(Context context, GoogleMap map, ClusterManager<Sucursal> clusterManager) {
        super(context, map, clusterManager);

        mContext = context;
        mClusterManager = clusterManager;
        mIconGenerator = new CustomIconGenerator(mContext.getApplicationContext());
        mClusterIconGenerator = new IconGenerator(mContext.getApplicationContext());

        int padding = (int) mContext.getResources().getDimension(R.dimen.custom_profile_padding);
        int dimension = (int) mContext.getResources().getDimension(R.dimen.custom_profile_image);

        //R.layout.map_cluster_layout is a simple XML with the visual elements to use in markers and cluster
        View view = ((AppCompatActivity)mContext).getLayoutInflater().inflate(R.layout.map_cluster_layout, null);
        mClusterIconGenerator.setContentView(view);
        mClusterImageView = (ImageView) view.findViewById(R.id.image);
        mClusterImageView.setPadding(padding, padding, padding, padding);

        mImageView = new ImageView(mContext.getApplicationContext());
        mImageView.setLayoutParams(new ViewGroup.LayoutParams(dimension, dimension));
        mImageView.setPadding(padding, padding, padding, padding);
        mIconGenerator.setContentView(mImageView);

        CustomIconBackground customIconBackground = new CustomIconBackground(false);
        mIconGenerator.setBackground(customIconBackground);
        mIconGenerator.customIconBackground = customIconBackground;
        mClusterIconGenerator.setBackground(new CustomIconBackground(true));
    }

    ...

    @Override
    protected void onBeforeClusterItemRendered(final Sucursal sucursal, MarkerOptions markerOptions) {

        mImageView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_no_image));
        Bitmap icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected void onClusterItemRendered(Sucursal clusterItem, Marker marker) {
        CustomSimpleTarget simpleTarget = new CustomSimpleTarget();
        simpleTarget.sucursal = clusterItem;
        simpleTarget.markerToChange = marker;
        ImageLoaderManager.setImageFromId(simpleTarget, clusterItem.logo, mContext);
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<Sucursal> cluster, MarkerOptions markerOptions) {
        mClusterImageView.setImageDrawable(ResourcesCompat.getDrawable(mContext.getResources(), R.drawable.ic_sucursales, null));
        Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }

    /**
     * Just extends {@link IconGenerator} and give the ability to change background.
     * Used to know highlight the current selected item in UI.
     */
    private class CustomIconGenerator extends IconGenerator {
        private CustomIconBackground customIconBackground;
        private CustomIconGenerator(Context context) {
            super(context);
        }
    }


    /**
     * Create a custom icon to use with {@link Marker} or {@link Cluster<Sucursal>}
     */
    private class CustomIconBackground  extends Drawable {

        private final Drawable mShadow;
        private final Drawable mMask;
        private int mColor = Color.WHITE;

        private boolean useSelectionColor;
        private int mColorSelection;

        private CustomIconBackground(boolean isCluster) {
            useSelectionColor = false;

            if (isCluster) {
                mMask = ContextCompat.getDrawable(mContext, R.drawable.map_pin_negro_cluster);
                mShadow = ContextCompat.getDrawable(mContext, R.drawable.map_pin_transparente_cluster);
            }
            else {
                mMask = ContextCompat.getDrawable(mContext, R.drawable.map_pin_negro);
                mShadow = ContextCompat.getDrawable(mContext, R.drawable.map_pin_transparente);
            }
        }

        public void setColor(int color) {
            mColor = color;
        }

        private void useSelectionColor(boolean value, int color) {
            useSelectionColor = value;
            mColorSelection = color;
        }
        @Override
        public void draw(@NonNull Canvas canvas) {
            mMask.draw(canvas);
            canvas.drawColor(mColor, PorterDuff.Mode.SRC_IN);
            mShadow.draw(canvas);

            if (useSelectionColor) {
                canvas.drawColor(mColorSelection, PorterDuff.Mode.SRC_IN);
                useSelectionColor = false;
            }
        }

        @Override
        public void setAlpha(int alpha) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void setColorFilter(ColorFilter cf) {
            throw new UnsupportedOperationException();
        }

        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }

        @Override
        public void setBounds(int left, int top, int right, int bottom) {
            mMask.setBounds(left, top, right, bottom);
            mShadow.setBounds(left, top, right, bottom);
        }

        @Override
        public void setBounds(@NonNull Rect bounds) {
            mMask.setBounds(bounds);
            mShadow.setBounds(bounds);
        }

        @Override
        public boolean getPadding(@NonNull Rect padding) {
            return mMask.getPadding(padding);
        }
    }

Das ImageLoaderManager ist nur eine Fassade für Glide.

public static void setImageFromId(SimpleTarget<GlideDrawable> simpleTarget, String id, Context context) {

    if (context instanceof AppCompatActivity) {
        AppCompatActivity activity = (AppCompatActivity)context;
        if (activity.isDestroyed())
            return;
    }
    Glide.with(context)
            .load(id)
            .fitCenter()
            .placeholder(R.drawable.ic_no_image)
            .into(simpleTarget);
}

  • Ich denke nicht, dass das das Problem ist – aber das Ganze markerToChange das Ding sieht schlecht aus. Warum nicht die Markierung an die übergeben CustomSimpleTarget Konstrukteur? Auf diese Weise hat der Callback einen (schwachen?) Verweis auf die Markierung, und Sie müssen nicht alle Markierungen durchlaufen oder raten, dass dies die richtige Markierung ist.

    – Yoni Gross

    9. Februar 2017 um 1:22 Uhr

  • Hallo @YoniGross CustomSimpleTarget ist ein asynchroner Prozess (wenn Glide das Bild herunterlädt). Wenn das Bild heruntergeladen wird, kennen Sie den Status der Markierungen in diesem Moment nicht und die Markierung, die Sie an den Konstruktor übergeben könnten, könnte sich noch im Speicher befinden, aber nicht auf der Karte angezeigt werden (weil sie gerade mit neuen Markierungen in der Karte synchronisiert wird , sehen Sie sich an, wie Markierungen aktualisiert wurden, wenn Sie in android-maps-utils hinein-/herauszoomen, und Sie werden verstehen, wovon ich spreche).

    – MiguelHincapieC

    9. Februar 2017 um 3:30 Uhr


  • Abgesehen davon denke ich, dass Sie mit diesem Marker nicht viel erreichen würden, ich meine, auf diese Weise, bevor Sie es versuchen setIcon() Ich bin mir sicher, dass ich die Markierung habe … nehme an, Sie versuchen, sie in den Konstruktor zu bekommen … das Problem bleibt immer noch in der nächsten Codezeile markerToChange.setIcon

    – MiguelHincapieC

    9. Februar 2017 um 3:34 Uhr

  • Wie auch immer, wenn Sie eine bessere Implementierung von haben SimpleTarget<GlideDrawable>Ich würde mich freuen, wenn Sie es mit der SO-Community teilen können

    – MiguelHincapieC

    9. Februar 2017 um 3:36 Uhr

  • haben Sie versucht?Glide.with(context).load(id).fitCenter().placeholder(R.drawable.ic_no_image).override(60, 60).into(simpleTarget);

    – Lalit Jadav

    9. Februar 2017 um 9:57 Uhr

Beim Löschen der Karte mit

    googleMap.clear();

**remove any reference to all the markers** auf der Karte. Ich hatte das Problem und stellte fest, dass das Problem bei meinem Code lag, bei dem ich vergessen hatte, den Verweis auf eine Markierung zu entfernen, und versuchte, das Symbol von a zu ändern cleared Marker

  • Toller Tipp! Das war nicht genau mein Fall, aber es hat auf mein Problem hingewiesen. Nach einem Geräte-Reset oder einem Ereignis, bei dem die Zurück-Taste gedrückt wurde, wurde die Karte neu geladen und alle gespeicherten Kartenmarkierungen wurden ungültig. Ich habe alle Markierungen schön neu erstellt, aber ich habe 1 Referenz vergessen, die ich getrennt von meiner Array-Liste gepflegt habe. Nachdem ich die Streumarkierung aus der alten neu erstellt hatte, wurde mein Fehler behoben.

    – ByteSlinger

    3. März 2018 um 19:02 Uhr

  • Wenn Sie also beispielsweise viele Punkte hatten und durch Auswahl das Symbol aktualisieren und den vorherigen Punkt auf das normale Symbol zurücksetzen möchten, mussten Sie nach dem Wiederaufnahmefragment wissen, was dieser letzte Punkt war. Also muss ich eine Referenz zu meinem letzten Marker behalten.

    – Mahdi

    5. Dezember 2019 um 8:11 Uhr

Ich habe festgestellt, dass dies beim Zugriff auf den Marker nach dessen Entfernung passiert ist. Die Interaktion mit dem Marker im Callback ist genau dieser Fall. Wie in der API von Map erwähnt:

Nachdem ein Marker entfernt wurde, ist das Verhalten aller seiner Methoden undefiniert.
https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#remove()

Die beste Option wäre zu überprüfen, ob die Markierung von der Karte entfernt wurde oder nicht.
Aber wir haben keine solche API. Und ich habe eine andere Problemumgehung gefunden, wir können Marker verwenden setTag und getTag. Tag wird auf null gesetzt, wenn Marker entfernt wird:

Google Maps Android API liest oder schreibt diese Eigenschaft nicht, außer dass diese Eigenschaft auf null gesetzt wird, wenn eine Markierung von der Karte entfernt wird.
https://developers.google.com/android/reference/com/google/android/gms/maps/model/Marker.html#setTag(java.lang.Object)

Verwenden Sie beim Erstellen von Markern ein Tag dafür.
Beim Aktualisieren des Markierungsprüftags ist nicht null.

Das könnte in deinem Fall helfen.

@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);
}

Und im Rückruf

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));
            }
        }
    }
}

  • Ich stimme Ihrer Analyse zu, obwohl ich festgestellt habe, dass das Hinzufügen eines Wrappers um den Marker herum, um dieses Flag „Wurde es entfernt worden“ und andere Daten zu verwalten, von Vorteil war, einfach weil die API sagt: „Nachdem ein Marker entfernt wurde, ist das Verhalten aller seiner Methoden nicht definiert.” was theoretisch das ‘getTag’ beinhalten würde – aber offensichtlich in der Implementierung funktioniert das ‘getTag’ offensichtlich immer noch.

    Benutzer2711811

    11. Januar 2018 um 2:58 Uhr


  • Weiterhin zeigen die API-Dokumente (die Ihrem Link folgen) nicht mehr an, dass sie tag auf null setzt, wenn sie entfernt werden, sondern weisen den Client an, setTag(null) aufzurufen (was der Anweisung “Verhalten aller anderen Methoden ist undefiniert” widerspricht, aber immer noch zu funktionieren scheint .

    Benutzer2711811

    11. Januar 2018 um 3:08 Uhr

  • Die Lösung in meinem Fall: Hinzufügen von Tags zu Markern und Überprüfen des Tags, bevor das Symbol auf Marker gesetzt wird

    – Dan Alboteanu

    19. Juli 2019 um 20:23 Uhr


Benutzer-Avatar
Sourab Sharma

Ich habe auch die gleiche Ausnahme bekommen und das Setzen einer stillen Ausnahme mit try/catch wäre keine Lösung gewesen, da der Benutzer in meinem Fall den aktuellen Standort nicht sehen kann:

java.lang.IllegalArgumentException: Nicht verwalteter Deskriptor bei com.google.maps.api.android.lib6.common.kb(:com.google.android.gms.DynamiteModulesB:162) bei com.google.maps.api.android.lib6 .impl.oc(:com.google.android.gms.DynamiteModulesB:75) unter com.google.maps.api.android.lib6.impl.db.a(:com.google.android.gms.DynamiteModulesB:334) unter com.google.android.gms.maps.model.internal.q.onTransact(:com.google.android.gms.DynamiteModulesB:204) unter android.os.Binder.transact(Binder.java:361) unter com. google.android.gms.maps.model.internal.zzf$zza$zza.zzL (unbekannte Quelle) unter com.google.android.gms.maps.model.Marker.setIcon (unbekannte Quelle)

Womit ich beschäftigt war :

Minimieren Sie den Kartenfragmentbildschirm, indem Sie die Home-Taste drücken und dann die App vom Launcher starten.

Welcher Code tat:

Die Überprüfung ist, dass die Markierung nicht null ist und die Position nicht null ist, setzen Sie Position und Symbol.

     if (markerCurrentLocation == null && googleMap != null) {
            markerCurrentLocation = googleMap.addMarker(new MarkerOptions()
                    .position(new LatLng(0.0, 0.0))
                    .icon(null));
            markerCurrentLocation.setTag(-101);
       }

         if (markerCurrentLocation != null && location != null) {
                markerCurrentLocation.setPosition(new LatLng(location.getLatitude(), location.getLongitude()));
                if (ORDER_STARTED) {
                   markerCurrentLocation.setIcon(CURRENT_MARKER_ORANGE);
                } else {
                    markerCurrentLocation.setIcon(CURRENT_MARKER_GRAY);
                }       
         }

Ausnahme war bei: markerCurrentLocation.setIcon();

Wie ich diese Ausnahme losgeworden bin:

Ich habe die folgende Zeile entfernt

 if (markerCurrentLocation == null && googleMap != null) 

Das heißt, ich initialisiere den Marker erneut. Wenn Sie auf diesen Fehler stoßen, versuchen Sie nicht, setIcon() auf die alte Markierung zu setzen, sondern stattdessen die neue Markierung aufzublasen und dann setIcon() zu verwenden.

Erläuterung:

Ich nehme an (nicht sicher), dass der Ausnahmegrund war, wenn der Code versucht, setIcon() erneut auf den Marker zu setzen, auf dem er bereits gesetzt ist, in einem bestimmten Fall, wie in meinem Fall, dass die Karte fortgesetzt wird oder in Ihrem Fall der Marker aus dem sichtbaren Teil herausgeht map und kommt rein oder so ähnlich.

Sicherlich gibt es kein Problem mit dem Deskriptor, den wir von der Methode BitmapDescriptorFactory.fromBitmap() oder BitmapDescriptorFactory.fromResource() erhalten. Wie die Ausnahme andeutet, wurde der Deskriptor auf einem alten Marker nicht mehr verwaltet, verwenden Sie besser einen neuen.

  • Scheint, es ist die nächste Antwort auf mein Problem. Sie erhalten denselben Fehler aus einer anderen Ursache, aber es gab mir ein Licht darauf, was das Problem sein könnte. Das Schwierige ist, dass ich keine Geräte habe, auf denen der Fehler auftritt (es ist ein Brandabsturzbericht für eine App im Geschäft). Also werde ich versuchen, was Sie und @JadavLalit gesagt haben, eine neue Version veröffentlichen und dann warten, ob ich weiterhin den Fehlerbericht erhalte … oder nicht.

    – MiguelHincapieC

    10. Februar 2017 um 18:29 Uhr

  • Das Kopfgeld geht bald zu Ende und wie ich bereits sagte, Ihre Antwort kommt dem Problem am nächsten, also gebe ich Ihnen das Kopfgeld. Aber berücksichtigen Sie, dass Ihre Antwort (in diesem Moment) mir nur einen Weg oder eine Richtung gibt, in der ich nach dem Fehler suchen kann. Um die Antwort wie eine akzeptierte Antwort zu überprüfen, sollte sie den Code replizieren, zeigen, wo und wie der Fehler aufgetreten ist und wie er behoben werden kann.

    – MiguelHincapieC

    10. Februar 2017 um 18:39 Uhr

Diese Ausnahme tritt auf, wenn Ihr Marker von reclustered wurde ClusterManager. ClusterManager erstellt Marker beim Clustering neu. Um dies zu vermeiden, müssen Sie Ihren Marker von render of erhalten ClusterManeger:

ClusterIconRender render = (ClusterIconRender) mClusterManager.getRenderer();
Marker trueMarker = render.getMarker(clusterMarker);
if (trueMarker != null) {
    trueMarker.setIcon(...);
    ... // do whatever else your want with marker
}

Im obigen Code ClusterMarker implementiert ClusterItem und ClusterIconRender erweitert DefaultClusterRenderer.

Benutzer-Avatar
Benutzer2595794

Ich habe dieselbe Umgebung (maps-utils + benutzerdefinierter Renderer + Glide) und denselben Fehler IllegalArgumentException: Unmanaged descriptor.

Ich habe den Fehler behoben, indem ich überprüft habe, ob der Marker “gültig” ist, bevor ich das Symbol mit den Methoden gesetzt habe DefaultClusterRenderer.getCluster(Marker) und DefaultClusterRenderer.getClusterItem(Marker). Wenn beide zurückkommen nullich mache nichts auf dem onResourceReady(...) Methode.

In deinem Fall würde ich folgende Änderung versuchen CustomSimpleTarget:

private class CustomSimpleTarget extends SimpleTarget<GlideDrawable> {
    Sucursal sucursal;
    Marker markerToChange = null;

    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {

        if (getCluster(markerToChange) != null || getClusterItem(markerToChange) != null) {

            mImageView.setImageDrawable(resource);
            //currentSelectedItem is the current element selected in the map (Sucursal type)
            //mIconGenerator is a: CustomIconGenerator extends IconGenerator
            if (currentSelectedItem != null && sucursal.idalmacen.contentEquals(currentSelectedItem.idalmacen))
                mIconGenerator.customIconBackground.useSelectionColor(true, ContextCompat.getColor(mContext, R.color.colorAccent));
            else
                mIconGenerator.customIconBackground.useSelectionColor(false, 0);

            Bitmap icon = mIconGenerator.makeIcon();

            //GlideShortcutDrawable is a WeakReference<>(drawable)
            sucursal.setGlideShortCutDrawable(resource);
            markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
        }
    }
}

PS.: Ich kann das Problem leicht auf einem langsamen Gerät reproduzieren und den App-Cache vor dem Testen löschen (um Glide zum Laden aus dem Netzwerk zu zwingen). Dann öffne ich die Karte und führe einige Vergrößerungen/Verkleinerungen durch, bevor Markierungen geladen werden.

Benutzer-Avatar
mobiledev Alex

Hatte die gleiche Ausnahme nach dem Hinzufügen des Clusters. Ich habe es behoben, indem ich angerufen habe:

clusterManager.clearItems()

Anstatt die zuvor verwendete Methode aufzurufen, ohne Cluster:

googleMap.clear();

Benutzer-Avatar
Harmantj

Stellen Sie sicher, dass das Symbol, das Sie für die Markierung verwenden, kein Vektor sein sollte, sondern ein .png-Bild.

  • Leider sind sie alle .png

    – MiguelHincapieC

    9. Februar 2017 um 16:37 Uhr

  • @Harmantj Sie können ein Vektorbild als Markierung verwenden, für das Sie etwas Code hinzufügen müssen

    – Kauschik

    5. Februar 2020 um 8:34 Uhr

1227120cookie-checkIllegalArgumentException: Nicht verwalteter Deskriptor mit gms.maps.model.Marker.setIcon

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy