8

Tôi đang cố đặt biểu tượng Điểm đánh dấu trong Google Maps phiên bản 2. Tôi đang tải xuống một số hình ảnh qua mạng và thay đổi nền của chúng trong mã. Sau đó tôi đặt chúng làm biểu tượng cho các điểm đánh dấu. Lúc đầu tạo bản đồ nó hoạt động tốt nhưng sau khi xoay có một ngoại lệ.Đã phát hành tham chiếu bitmap không xác định

phiên bản Android tôi chạy trên: 4.3

Mã của tôi là như sau:

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

VenuesHelper.iconizeBitmap() là như sau:

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

Stack trace như sau:

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) 

Trả lời

1

Tìm ra giải pháp. Tôi đã kiểm tra nếu bitmap nằm trong bộ nhớ cache trước khi tải lại nó, nhưng tôi đã quên để kiểm tra bộ nhớ cache hit. Bây giờ tôi đã sửa đổi mã và nó không còn bị treo nữa. Tôi không thể tìm ra lý do chính xác của vụ tai nạn khó khăn, có lẽ một số vấn đề thu gom rác ngớ ngẩn.

Đây là mã sửa đổi mà không còn bị treo:

 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

Tôi đã có một vấn đề tương tự, khi tôi cố gắng tải lại một Marker thực hiện "myMarker.setIcon()", sau đó sau khi một số làm mới ứng dụng chạy vào "java.lang.IllegalArgumentException: Đã phát hành tham chiếu bitmap không xác định".

Tôi phát hiện ra rằng gọi "myMap.clear()" để làm sạch tất cả các điểm đánh dấu là vấn đề, Trên thực tế, bạn có thể đọc "Xóa tất cả các điểm đánh dấu, đa giác, đa giác, lớp phủ, v.v ... khỏi bản đồ". .

Vâng, đó là "vv" dường như làm nhiều như tôi mong đợi ...

Để giải quyết mà tôi đã sử dụng một chức năng tùy chỉnh để lặp qua tất cả các dấu hiệu của tôi được lưu trong một HashMap và loại bỏ từng người một, và đó là lý tất cả, không có nhiều ngoại lệ như thế trong mã của tôi.

Bạn có thể lặp qua tất cả các dấu hiệu để loại bỏ chúng như sau:

/** 
* 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

tôi đã cùng một ngoại lệ nhưng trong một trường hợp sử dụng khác nhau. Tạo lại các điểm đánh dấu đã làm các trick! Cảm ơn. – Loda

Các vấn đề liên quan