web-dev-qa-db-ja.com

原因:Java.lang.OutOfMemoryError:ビットマップサイズがVM budgetを超えている

私のアプリケーションでは、強制的に終了しようとすると、「setContentView(R.layout.Menu);」という行を指すエラーが発生します。レイアウトの。また、XMLファイルでは、レイアウトに「OutOfMemoryError」イメージビューが表示されます。私は本当に混乱しています。さらに進んでください。

編集済み:

私のアプリケーションはデータベースを使用し、最初にいくつかのXMLデータを解析し、S​​qliteデータベースに挿入します。 Outofmemoryの問題は初めて発生します。 2回目は正常に動作します。 System.gc()を試しました。何か問題はありますか。

これは私のログです:

E/dalvikvm-heap(2712): 105376-byte external allocation too large for this process.
VM won't let us allocate 105376 bytes

    FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Test/com.Test.Menu}: Android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1647)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1663)
    at Android.app.ActivityThread.access$1500(ActivityThread.Java:117)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:931)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:130)
    at Android.app.ActivityThread.main(ActivityThread.Java:3683)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:507)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: Android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:518)
    at com.Android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.Java:56)
    at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:568)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:623)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:626)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:408)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:320)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:276)
    at com.Android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.Java:207)
    at Android.app.Activity.setContentView(Activity.Java:1657)
    at com.Test.Menu.onCreate(Menu.Java:32)
    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1611)
    ... 11 more
Caused by: Java.lang.reflect.InvocationTargetException
    at Java.lang.reflect.Constructor.constructNative(Native Method)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:415)
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:505)
    ... 23 more
Caused by: Java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    at Android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at Android.graphics.BitmapFactory.decodeStream(BitmapFactory.Java:460)
    at Android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.Java:336)
    at Android.graphics.drawable.Drawable.createFromResourceStream(Drawable.Java:697)
    at Android.content.res.Resources.loadDrawable(Resources.Java:1709)
    at Android.content.res.TypedArray.getDrawable(TypedArray.Java:601)
    at Android.widget.ImageView.<init>(ImageView.Java:118)
    at Android.widget.ImageView.<init>(ImageView.Java:108)

これは私のXMLコードです:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">

<RelativeLayout
    Android:id="@+id/RL_Title"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_weight="8"
    Android:onClick="onTitleClick" >

    <ImageView
        Android:id="@+id/Img_Title_bg"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:scaleType="center"
        Android:src="@drawable/title_bg" />

    <Button
        Android:id="@+id/Btn_Title"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_centerVertical="true"
        Android:layout_marginRight="5dp"
        Android:background="@drawable/title_al"
        Android:drawableRight="@drawable/pro"
        Android:gravity="center"
        Android:onClick="onTitleClick" />
</RelativeLayout>

<RelativeLayout
    Android:id="@+id/RL_MainMenu"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_weight="1" Android:onClick="onDoNothing">

    <ImageView
        Android:id="@+id/ImageView01"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="4"
        Android:src="@drawable/main_bg" Android:scaleType="centerCrop"/>

    <ImageView
        Android:id="@+id/Img_logo"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_weight="4"
        Android:scaleType="center"
        Android:src="@drawable/logo_al" />

    <LinearLayout
        Android:id="@+id/LI_Menu"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_above="@+id/RL_ExtraOption"
        Android:layout_alignTop="@+id/Img_logo"
        Android:layout_margin="2dp"
        Android:orientation="vertical" >

        <ImageButton
            Android:id="@+id/Img_Buyer"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="1dp"
            Android:layout_weight="1"
            Android:background="@drawable/bt_blink"
            Android:onClick="Nextclick"
            Android:scaleType="fitCenter"
            Android:soundEffectsEnabled="true"
            Android:src="@drawable/buyer_icon" />

        <ImageButton
            Android:id="@+id/Img_Seller"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="1dp"
            Android:layout_weight="1"
            Android:background="@drawable/bt_blink"
            Android:onClick="Nextclick"
            Android:scaleType="fitCenter"
            Android:src="@drawable/seller_icon" />

        <ImageButton
            Android:id="@+id/Img_Lender"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="1dp"
            Android:layout_weight="1"
            Android:background="@drawable/bt_blink"
            Android:onClick="Nextclick"
            Android:scaleType="fitCenter"
            Android:src="@drawable/lender_icon" />

        <ImageButton
            Android:id="@+id/Img_myTitleRep"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="1dp"
            Android:layout_weight="1"
            Android:background="@drawable/bt_blink"
            Android:onClick="Nextclick"
            Android:scaleType="fitCenter"
            Android:src="@drawable/my_title_rep_icon_al" />

        <ImageButton
            Android:id="@+id/Img_Setup"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_margin="1dp"
            Android:layout_weight="1"
            Android:background="@drawable/bt_blink"
            Android:onClick="Nextclick"
            Android:scaleType="fitCenter"
            Android:src="@drawable/setup_icon" />
    </LinearLayout>

    <RelativeLayout
        Android:id="@+id/RL_ExtraOption"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:background="@drawable/main_bottom_bg" >

        <TextView
            Android:id="@+id/txt_RepName"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerVertical="true"
            Android:layout_marginLeft="10dp"
            Android:textColor="@color/white"
            Android:textSize="@dimen/font_size" />

        <TableRow
            Android:id="@+id/TR_ContactRep"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentRight="true"
            Android:layout_centerVertical="true"
            Android:gravity="center" >

            <Button
                Android:id="@+id/Btn_ContactRep"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginRight="3dp"
                Android:background="@drawable/contact_rep_blink"
                Android:onClick="ContactRep_Click" />

            <Button
                Android:id="@+id/Btn_MoreOption"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginRight="5dp"
                Android:background="@drawable/main_more_blink"
                Android:onClick="onMoreClick" />
        </TableRow>
    </RelativeLayout>

    <LinearLayout
        Android:id="@+id/ln_Mainmore"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="@drawable/dialog_bg" Android:layout_alignParentBottom="true" Android:visibility="gone">

        <LinearLayout
            Android:id="@+id/LinearLayout02"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="3"
            Android:orientation="vertical" >
        </LinearLayout>

        <TableLayout
            Android:id="@+id/TableLayout01"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:gravity="center" >

            <TableRow
                Android:id="@+id/TableRow04"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:layout_margin="5dp"
                Android:layout_marginTop="20dp"
                Android:gravity="center" >

                <Button
                    Android:id="@+id/Btn_Rate"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_weight="1"
                    Android:background="@drawable/property_blue_blink"
                    Android:onClick="onRate"
                    Android:singleLine="true"
                    Android:text="Rate/Testimonial"
                    Android:textColor="@color/white"
                    Android:textSize="@dimen/font_size"
                    Android:textStyle="bold" />
            </TableRow>

            <TableRow
                Android:id="@+id/TableRow01"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:layout_margin="5dp"
                Android:gravity="center" >

                <Button
                    Android:id="@+id/btn_SubFeature"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_weight="1"
                    Android:background="@drawable/property_blue_blink"
                    Android:onClick="onSubFeature"
                    Android:singleLine="true"
                    Android:text="Submit A Feature"
                    Android:textColor="@color/white"
                    Android:textSize="@dimen/font_size"
                    Android:textStyle="bold" />
            </TableRow>

            <TableRow
                Android:id="@+id/TableRow03"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:layout_margin="5dp"
                Android:gravity="center" >

                <Button
                    Android:id="@+id/Btn_ReferFrnd"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_weight="1"
                    Android:background="@drawable/property_blue_blink"
                    Android:onClick="onReferAFrnd"
                    Android:text="Refer A Friend"
                    Android:textColor="@color/white"
                    Android:textSize="@dimen/font_size"
                    Android:textStyle="bold" />
            </TableRow>

            <TableRow
                Android:id="@+id/TableRow02"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:layout_margin="5dp"
                Android:gravity="center" >

                <Button
                    Android:id="@+id/Btn_cancel"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_weight="1"
                    Android:background="@drawable/property_cancel_blink"
                    Android:onClick="onClose"
                    Android:text="Cancel"
                    Android:textColor="@color/black"
                    Android:textSize="@dimen/font_size"
                    Android:textStyle="bold" />
            </TableRow>
        </TableLayout>

        <LinearLayout
            Android:id="@+id/linearLayout2"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="3"
            Android:orientation="vertical" >
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>
27
Sniper

これは、AndroidのImageViewを古いデバイスで大きな画像で使用する場合の典型的な問題です(ファイルサイズが数Kbsのみであっても)。画像のデコードに使用されるskiaと呼ばれるネイティブグラフィックライブラリは、画像のサイズに基づいてネイティブメモリを割り当てるため、ファイルサイズはこれに直接影響しません。

XMLレイアウト定義でsrc- attributeを省略してonCreate()メソッドに自分で画像をロードしても、同じエラーがトリガーされます。これを回避する唯一の方法は、_BitmapFactory.decodeStream_でinSampleSizeを使用して、デコード中に直接ダウンサンプリングを実行することです( ビットマップオブジェクトへのイメージのロード中のメモリ不足の問題 =例)。これ自体が、このスケール係数を決定する方法の問題を提起します。

大きな画像を処理するときに見つけた最良の解決策は、ImageViewWebViewに置き換えて、次のような最小限のHTMLをロードすることです。

_webView.loadUrl("file:///Android_res/raw/background.html");
_

_raw/background.html_の内容は次のようになります。

_<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <style type="text/css">
        body {
            margin: 0;
        }

        img {
            width: 100%;
            height: auto;
            display: block;
        }
    </style>
</head>
<body>
    <img src="file:///Android_res/drawable/background.png" />
</body>
_

WebViewで使用されるWebKitエンジンは、より効率的な方法で画像の読み込みを実行するため、これらのメモリ割り当てエラーは解消されます。

_drawable-port_と_drawable-land_に配置することで、ポートレートとランドスケープに異なる画像を使用することもできます。ただし、clearCache(false)メソッドでWebViewインスタンスのonDestroy()を呼び出す必要があります。そうしないと、最初のロードでキャッシュされたイメージが常に使用されます(WebViewインスタンスでのキャッシュの無効化は機能しません) )。

6
Andreas Klöber

この問題に多くの時間を費やした後、私は解決策を見つけました!あなたがする必要があるのは、より多くのメモリを要求することです。このコードをAndroidマニフェストの下に配置します:

<application>:

プット:

Android:largeHeap="true"

私にとってはうまくいきました!このソリューションはAPI 11以降でのみ機能することに注意してください。

詳細 こちら

5
Mark Kazakov

人々がここに書いたものに加えて、私はこのgoogleのビデオを見ることをお勧めします。これはいくつかの一般的なメモリの問題とメモリの問題の原因を見つける方法を示しています:

Androidアプリ のメモリ管理

4

多くのデバイスでは、各デバイスで使用できるメモリが非常に限られ、制限されています。多くの古いデバイスは16MBのメモリをアプリケーションに割り当てますが、最近のデバイスの中には24MBまたは32MBを割り当てるものもあります(14MBのデバイスを見たことがあります)。

非常に多くの画像をメモリにロードすると、このスペースはすぐにいっぱいになり、OutOfMemoryErrorがスローされます。この問題を解決するには、(前の回答で述べたように)画像をサムネイルに縮小し、サムネイルをデバイスメモリに保持する(メモリフットプリントを削減する)だけで、画像をSDCARDに保存する必要があります。

EclipseのDDMSレイアウトから、プログラムが使用しているメモリ量を確認できます。 Applicationクラスをオーバーライドして、「メモリ不足」警告機能をリッスンすることもできると思います。

BitmapFactoryを介してBitmapを読み取る場合、BitmapFactory.Option inScaledパラメーターを2または4(または適切に機能するもの)に設定して、より小さく、メモリー消費の少ないイメージを作成します。

一般的に、解決策は1つだけです。小さい画像を使用します。コードがない場合、何が正確に間違っているかを言うのは困難です。画像サイズを小さくしてみてください。

4

以前同じ問題があり、S4でデバッグしていましたAndroid 4.3。解決策は次のとおりでした:mdpiフォルダーからhdpiフォルダーに画像をコピーします現在、両方のフォルダにあります)

変だね!しかし、これは私の問題を解決しました。

3
Hasan Shouman

あなたの画像は大きいサイズのようで、画像をデコードしてAndroid:largeHeap = "true"。 Application Tagのマニフェスト内で使用できます。

2
Prakash

上記のすべての解決策を経験したかもしれませんが、試してみてください。解決するまで、解決策を見つけることができませんでした。これはあなたのケースで夜働くかもしれません(その場合すみません)。

myIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK); myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

アクティビティを呼び出す前にこれらを配置してください。

0
Narasimha