重复从地图上的drawable中取出的6位数会导致内存不足错误

时间:2013-01-22 19:24:22

标签: android bitmap

我已经尝试在这个和其他一些网站上找到我的问题的解决方案,但没有运气。我在我的应用上设置了地图(谷歌地图V2)。此地图充满了标记(大约450个),每个标记都有一个可绘制文件的图标集。可绘制文件总共为6个,因此大约有450个标记重复6个绘图(每个不同的图标指的是地图上的位置)。当我第一次启动地图时,没有问题,一切正常。但是,如果我回到上一个屏幕并再次启动地图,应用程序会因内存不足错误而崩溃。我认为这个问题是由于系统将所有位图保存在内存中,并且浪费了大量资源,看到可绘制的只有六个。

我尝试按照建议的here将位图引用到应用程序上下文中,但效果不佳。有没有简单的方法来解决这个问题?

第324行:

if (IDTipologia.get(i).equals("1")) {
            setLoghino(R.drawable.chieseluoghidiculto);
            //iconcina = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE);
            Bitmap icon = BitmapFactory.decodeResource(getApplicationContext().getResources(),
                    R.drawable.markerchiese);
            iconcina = BitmapDescriptorFactory.fromBitmap(icon);
}

广告,直到第6个drawable。

logcat的:

E/AndroidRuntime(10990): FATAL EXCEPTION: main
E/AndroidRuntime(10990): java.lang.OutOfMemoryError
E/AndroidRuntime(10990):    at android.graphics.Bitmap.nativeCreateFromParcel(Native   Method)
E/AndroidRuntime(10990):    at android.graphics.Bitmap.access$000(Bitmap.java:28)
E/AndroidRuntime(10990):    at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1052)
E/AndroidRuntime(10990):    at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1044)
E/AndroidRuntime(10990):    at com.google.android.gms.maps.model.internal.IBitmapDescriptorFactoryDelegate$Stub.onTransact(IBitmapDescriptorFactoryDelegate.java:101)
E/AndroidRuntime(10990):    at android.os.Binder.transact(Binder.java:297)
E/AndroidRuntime(10990):    at com.google.android.gms.internal.h$a$a.a(Unknown Source)
E/AndroidRuntime(10990):    at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(Unknown Source)
E/AndroidRuntime(10990):    at it.eventitrapani.appaeventitp.ElencoMappaTutteCoseDaVedere.addMarkersToMap(ElencoMappaTutteCoseDaVedere.java:324)
E/AndroidRuntime(10990):    at it.eventitrapani.appaeventitp.ElencoMappaTutteCoseDaVedere.setUpMap(ElencoMappaTutteCoseDaVedere.java:269)
E/AndroidRuntime(10990):    at it.eventitrapani.appaeventitp.ElencoMappaTutteCoseDaVedere.setUpMapIfNeeded(ElencoMappaTutteCoseDaVedere.java:257)
E/AndroidRuntime(10990):    at it.eventitrapani.appaeventitp.ElencoMappaTutteCoseDaVedere.onCreate(ElencoMappaTutteCoseDaVedere.java:208)
E/AndroidRuntime(10990):    at android.app.Activity.performCreate(Activity.java:4470)
E/AndroidRuntime(10990):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
E/AndroidRuntime(10990):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
E/AndroidRuntime(10990):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
E/AndroidRuntime(10990):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
E/AndroidRuntime(10990):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
E/AndroidRuntime(10990):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(10990):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(10990):    at android.app.ActivityThread.main(ActivityThread.java:4511)
E/AndroidRuntime(10990):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(10990):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(10990):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
E/AndroidRuntime(10990):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
E/AndroidRuntime(10990):    at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

首先,为什么要从这样的资源中加载你的位图?您可以直接从资源Drawable获取getResources().getDrawable(R.drawable.blah)。如果您像这样检索Drawable,它们将共享底层的Bitmap,因此只有N(其中N是您拥有的标记图标的数量)位图在内存中加载。

现在,如果你要对drawable应用一些转换,你可能需要首先调用mutate()来获得一个具有单独状态的新Drawable(否则如果你使一个透明,所有它们将变得透明)

<强>更新 解决方案是使用标记图标初始化,它直接使用资源ID而不是位图:

markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));