0

私はすでにこのサイトや他のいくつかのサイトで自分の問題の解決策を見つけようとしましたが、運がありませんでした。アプリに地図(GoogleマップV2)を設定しています。このマップはマーカー(約450)でいっぱいで、各マーカーには描画可能なファイルから設定されたアイコンがあります。ドローアブルファイルは合計6つあるため、6つのドローアブルを繰り返す約450のマーカーがあります(それぞれの異なるアイコンはマップ上の場所を示します)。私が最初にマップを起動したとき、問題はなく、すべてが正常に機能しています。しかし、前の画面に戻ってマップを再度起動すると、メモリ不足エラーでアプリがクラッシュします。問題は、システムがすべてのビットマップをメモリに保持しているという事実によるものだと思います。ドローアブルは6つしかないため、リソースが大幅に浪費されています。

ここで提案されているように、ビットマップをアプリケーションコンテキストに参照しようとしましたが、良い結果は得られませんでした。この問題を解決する簡単な方法はありますか?

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番目のドローアブルまで広告など。

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)
4

1 に答える 1

1

まず第一に、なぜそのようなリソースからビットマップをロードするのですか?Drawableリソースから直接取得できますgetResources().getDrawable(R.drawable.blah)。そのようにDrawableを取得すると、それらはすべて基になるビットマップを共有するため、メモリにロードされるビットマップはN個(Nはマーカーアイコンの数)のみになります。

ここで、ドローアブルに何らかの変換を適用する場合は、mutate()最初にそれを呼び出して、別の状態の新しいドローアブルを取得する必要があります(そうでない場合、1つを透明にすると、すべてが透明になります)。

更新: 解決策は、ビットマップの代わりにリソースIDを直接使用するマーカーアイコンの初期化を使用することでした。

markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
于 2013-01-23T15:02:57.587 に答える