0

私のAndroidプロジェクトには、画像付きのカスタムグリッドビューがあります。画像はアセットフォルダーから取得されます。

以下は、アセット フォルダーからドローアブルを取得するためのコードです。

Drawable imgDrawable = Drawable.createFromStream(myContext.getAssets().open(imgPath),null);

グリッド ビューをスクロールした後、メモリ不足の例外が表示されます。ログには次のように表示されます。

01-10 05:24:32.492: E/AndroidRuntime(2303): FATAL EXCEPTION: main
01-10 05:24:32.492: E/AndroidRuntime(2303): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at org.Infoware.BookShelf.BookShelfActivity$BookshelfAdapter.getView(BookShelfActivity.java:331)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.AbsListView.obtainView(AbsListView.java:1439)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.GridView.makeAndAddView(GridView.java:1222)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.GridView.makeRow(GridView.java:268)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.GridView.fillDown(GridView.java:221)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.GridView.fillGap(GridView.java:188)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3569)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:3067)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.os.Handler.handleCallback(Handler.java:587)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.os.Looper.loop(Looper.java:130)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at android.app.ActivityThread.main(ActivityThread.java:3683)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at java.lang.reflect.Method.invokeNative(Native Method)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at java.lang.reflect.Method.invoke(Method.java:507)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
01-10 05:24:32.492: E/AndroidRuntime(2303):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

1

私の経験では、これは通常、別の場所でメモリ リークが発生しているために発生します。その後、アプリはどこかでクラッキングする可能性がありますが、ビットマップ操作中にメモリが不足する可能性が最も高いです。

于 2012-08-18T11:27:41.650 に答える
0

私は同じ問題を抱えていました。次に、Drawables の代わりに Bitmaps を使用することにしましたが、OutOfMemoryException が発生しなくなりました。

これにより、メモリの消費が少なくなります。

view.setImageBitmap( BitmapFactory.decodeFile( filename ) );

よりも

view.setImageDrawable( Drawable.createFromPath( filename ) );
于 2015-10-24T22:44:31.407 に答える