我正在尝试在Google Maps 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));
}
});
和VenuesHelper.iconizeBitmap()
如下:
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)
答案 0 :(得分:11)
我遇到了类似的问题,当我尝试重新加载执行“myMarker.setIcon()”的Marker时,经过一些刷新后,应用程序遇到了“java.lang.IllegalArgumentException:Released unknown bitmap reference”。
我发现调用“myMap.clear()”来清除所有标记是问题所在。实际上在函数文档中你可以读到“从地图中删除所有标记,折线,多边形,叠加等”。
嗯,“等”似乎按照我的预期做了更多...
为了解决这个问题,我使用了一个自定义函数来遍历HashMap中保存的所有标记并逐个删除,这就是我的代码中没有更多例外情况。
您可以迭代所有标记以删除它们,如下所示:
/**
* 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 :(得分:1)
找到解决方案。我在重新加载之前检查位图是否驻留在缓存中,但我忘记检查缓存命中。现在我修改了代码,它不再崩溃。我无法弄清楚崩溃的确切原因,可能是一些愚蠢的垃圾收集问题。
以下是不再崩溃的修改后的代码:
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));
}
});
}