2017-03-08 3 views
-1

OOMエラーが発生しました。アルゴリズムを動作させるためにビットマップ全体を使用する必要があります。Androidビットマップメモリ​​不足エラー

エラー:

Process: edu.illinois.ece.nano.labaware, PID: 10349                        java.lang.OutOfMemoryError: Failed to allocate a 357739212 byte allocation with 3485344 free bytes and 251MB until OOM 
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:620) 
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:455) 
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1152) 
    at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:720) 
    at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571) 
    at android.content.res.Resources.getDrawable(Resources.java:767) 
    at android.content.res.Resources.getDrawable(Resources.java:738) 
    at edu.illinois.ece.nano.labaware.ViewImageActivity.onCreate(ViewImageActivity.java:69) 
    at android.app.Activity.performCreate(Activity.java:6662) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

50: Log.d(TAG,"Going to convert image."); 
69: Drawable drawable = getResources().getDrawable(R.drawable.t); 
+0

本当に?あなたのアルゴリズムが動作するには、340 + MBのグラフィックがメモリにロードされている必要がありますか?アルゴリズムを再設計してみてください。 –

+0

この例外を取得しないように画像のサイズを変更しようとしましたか? – MuTiny

+0

ここにはもっと文脈が必要です。巨大なイメージをメモリにロードしているので、メモリ不足エラーが発生しています。これはかなり期待されているようです。何が助けを必要としますか?イメージの断片を個別に分析していますか?画像内のさまざまなオブジェクト間の関係を分析しようとしていますか?どのような代替アプローチを検討していますか? – Tyzoid

答えて

0

350 + MBはほとんどのモバイルデバイス上に表示されるだけではあまりにも大きいです。このイメージを表示するために、ウィジェット(たとえば、ImageView)の幅と高さを小さなサイズに設定しても、画像はメモリに完全にロードされてからウィジェットに表示されます。

this guidelineに従うと、画面に表示する必要があるサイズにビットマップをサブサンプリングすることができます。この方法を使用すると、メモリ使用量を大幅に減らすことができます。このイメージが完全にスクロール可能な領域(例えば大マップ)で表示する必要がある場合は、次のことができます。

  1. スクロールしながらその画像から特定の領域をロードするために使用BitmapRegionDecoder、または
  2. はに大きな画像を分割しましたこれらの小さな画像をすべて組み合わせて大容量マップを表示するhtmlファイルを作成し、このファイルと画像をassetsフォルダに置き、WebViewを使用してhtmlファイルをロードします。