8

Próbuję ustawić ikonę znacznika w Google Maps v2. Pobierałem niektóre obrazy przez sieć i zmieniłem ich tło w kodzie. Potem ustawiam je jako ikony na znaczniki. Na początku tworzenie mapy działa dobrze, ale po rotacji jest wyjątek.Released nieznany bitmap reference

wersja Android biegnę tym na: 4,3

Mój kod wygląda następująco:

 UrlImageViewHelper.loadUrlDrawable(TuvaletlerMapActivity.this, 
       iconUrl, new UrlImageViewCallback() { 

        @Override 
        public void onLoaded(ImageView iv, Bitmap bm, 
          String arg2, boolean arg3) { 
         Bitmap bitmap = VenuesHelper.iconizeBitmap(bm); 
         marker.setIcon(BitmapDescriptorFactory 
           .fromBitmap(bitmap)); 
        } 
       }); 

i VenuesHelper.iconizeBitmap() jest następujący:

public static Bitmap iconizeBitmap(Bitmap bm) { 
    Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), 
      bm.getConfig()); 
    Canvas canvas = new Canvas(bitmap); 
    canvas.drawColor(Color.parseColor("#33B5E5")); 
    canvas.drawBitmap(bm, 0, 0, null); 
    return bitmap; 
} 

Ślad stosu jest następująca:

08-07 10:16:50.684: E/AndroidRuntime(19001): FATAL EXCEPTION: main 
08-07 10:16:50.684: E/AndroidRuntime(19001): java.lang.IllegalArgumentException: Released unknown bitmap reference 
08-07 10:16:50.684: E/AndroidRuntime(19001): at maps.as.i.a(Unknown Source) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at maps.ah.o.b(Unknown Source) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at maps.ah.bn.a(Unknown Source) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at bix.onTransact(SourceFile:204) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.Binder.transact(Binder.java:347) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.google.android.gms.internal.dm$a$a.f(Unknown Source) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.google.android.gms.maps.model.Marker.setIcon(Unknown Source) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.behlul.tuvaletbul.TuvaletlerMapActivity$TuvaletliYukleCallbacks$1.onLoaded(TuvaletlerMapActivity.java:250) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$2.run(UrlImageViewHelper.java:615) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.onPostExecute(UrlImageViewHelper.java:653) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.koushikdutta.urlimageviewhelper.UrlImageViewHelper$3.onPostExecute(UrlImageViewHelper.java:1) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.AsyncTask.finish(AsyncTask.java:631) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.os.Looper.loop(Looper.java:137) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at java.lang.reflect.Method.invokeNative(Native Method) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at java.lang.reflect.Method.invoke(Method.java:525) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-07 10:16:50.684: E/AndroidRuntime(19001): at dalvik.system.NativeStart.main(Native Method) 

Odpowiedz

1

Znaleziono rozwiązanie. Sprawdzałem, czy bitmapa znajduje się w pamięci podręcznej przed ponownym jej załadowaniem, ale zapomniałem sprawdzić trafienie w pamięci podręcznej. Teraz zmodyfikowałem kod i już się nie psuje. Nie mogłem znaleźć dokładnej przyczyny katastrofy, prawdopodobnie jakieś głupie problemy ze zbieraniem śmieci.

Oto zmodyfikowany kod, który już nie wywala:

 Bitmap icon = UrlImageViewHelper.getCachedBitmap(iconUrl); 
     if (icon != null) { 
      marker.setIcon(BitmapDescriptorFactory 
        .fromBitmap(VenuesHelper.iconizeBitmap(icon))); 
     } else { //Added this else 
      UrlImageViewHelper.loadUrlDrawable(
        TuvaletlerMapActivity.this, iconUrl, 
        new UrlImageViewCallback() { 

         @Override 
         public void onLoaded(ImageView iv, Bitmap bm, 
           String arg2, boolean arg3) { 
          Bitmap bitmap = VenuesHelper 
            .iconizeBitmap(bm); 
          marker.setIcon(BitmapDescriptorFactory 
            .fromBitmap(bitmap)); 
         } 
        }); 
     } 
10

miałem podobny problem, kiedy próbował przeładować marker wykonujące „myMarker.setIcon()”, a następnie po pewnym odświeża aplikacja wpadł "java.lang.IllegalArgumentException: Released nieznane odniesienie do mapy bitowej".

Odkryłem, że problemem było wywołanie "myMap.clear()" w celu czyszczenia wszystkich znaczników. W rzeczywistości w dokumentach funkcji można przeczytać, że "Usuwa z mapy wszystkie znaczniki, polilinie, wielokąty, nakładki itp." .

Dobrze, że „etc” wydaje się zrobić więcej, jak się spodziewałem ...

Dla rozwiązywania że użyłem funkcji niestandardowej iterację wszystkich moich znaczników zapisanych w HashMap i usuwając jeden po drugim, a to wszystko, nie ma wyjątków takich jak ten w moim kodzie.

Można iterację wszystkich markerów, aby usunąć je w następujący sposób:

/** 
* Alternative to myMap.clear() to avoid undesired exceptions 
*/ 
private void clearAllMapMarkers() { 
    // Clearing the current map markers being shown 
    // Note that we do not use myMap.clear() because that incur in the exception 
    // "java.lang.IllegalArgumentException: Released unknown bitmap reference" 
    try { 
     for (Map.Entry<String, Marker> markerEntry : mMarkerList.entrySet()) { 
      markerEntry.getValue().remove(); 
     } 
    } catch (IllegalArgumentException e) { 
     // Manage here the exception (never raised but who knows...) 
    } 
} 
+1

Mam ten sam wyjątek, ale w innym przypadku użycia. Ponowne utworzenie znacznika zrobiło lewy! Dzięki. – Loda