Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 已发布未知位图引用_Android_Bitmap_Google Maps Markers_Google Maps Android Api 2 - Fatal编程技术网

Android 已发布未知位图引用

Android 已发布未知位图引用,android,bitmap,google-maps-markers,google-maps-android-api-2,Android,Bitmap,Google Maps Markers,Google Maps Android Api 2,我试图在谷歌地图v2中设置一个标记的图标。 我正在通过网络下载一些图片,并用代码更改它们的背景。之后,我将它们设置为标记的图标。在第一次创建贴图时,它可以正常工作,但旋转后会出现异常 我运行这个的Android版本:4.3 我的代码如下: UrlImageViewHelper.loadUrlDrawable(TuvaletlerMapActivity.this, iconUrl, new UrlImageViewCallback() {

我试图在谷歌地图v2中设置一个标记的图标。 我正在通过网络下载一些图片,并用代码更改它们的背景。之后,我将它们设置为标记的图标。在第一次创建贴图时,它可以正常工作,但旋转后会出现异常

我运行这个的Android版本:4.3

我的代码如下:

        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));
                    }
                });
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;
}
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)
/**
 * 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...)
    }
}
VenuesHelper.iconizeBitmap()
如下所示:

        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));
                    }
                });
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;
}
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)
/**
 * 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...)
    }
}
堆栈跟踪如下所示:

        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));
                    }
                });
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;
}
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)
/**
 * 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...)
    }
}

找到了解决办法。在重新加载位图之前,我正在检查位图是否驻留在缓存中,但我忘记检查缓存命中率。现在我修改了代码,它不再崩溃。我不知道崩溃的确切原因,可能是一些愚蠢的垃圾收集问题

以下是修改后的代码,不再崩溃:

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

我有一个类似的问题,当我试图重新加载一个执行“myMarker.setIcon()”的标记时,在一些刷新之后,应用程序运行到一个“java.lang.IllegalArgumentException:Released unknown bitmap reference”

我发现调用“myMap.clear()”清除所有标记是个问题,事实上,在函数文档中,您可以看到“从地图中删除所有标记、多段线、多边形、覆盖等”

嗯,那个“等”似乎比我想象的要多

为了解决这个问题,我使用了一个自定义函数来迭代保存在HashMap中的所有标记,并逐个删除,仅此而已,代码中不再出现类似的异常

您可以按如下方式遍历所有标记以删除它们:

        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));
                    }
                });
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;
}
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)
/**
 * 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...)
    }
}
/**
*myMap.clear()的替代方案,以避免意外的异常
*/
私有void clearAllMapMarkers(){
//清除正在显示的当前地图标记
//请注意,我们不使用myMap.clear(),因为这会导致异常
//“java.lang.IllegalArgumentException:已发布未知位图引用”
试一试{
对于(Map.Entry markerEntry:mMarkerList.entrySet()){
markerEntry.getValue().remove();
}
}捕获(IllegalArgumentException e){
//在此管理异常(从未提出,但谁知道…)
}
}

我得到了相同的异常,但在不同的用例中。重新创建标记成功了!谢谢