0

だから私はソフトウェアを書いていますが、2番目のドローアブルを作成しようとするとクラッシュし続けます。フロントスクリーンから開始し、ボタンを押すと新しいアクティビティに移動します。そのアクティビティでは、中央に ImageView があり、下部にボタンがあります。アクティビティが読み込まれると、ImageView にドローアブルがあります。そのため、下部のボタンをクリックすると、ImageView にあるドローアブルが変更されるはずですが、クラッシュします。LogCat に次のようなエラーが見つかりました。

E/AndroidRuntime(1385): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

だからここにその活動からの私のコードがあります:

package com.foocity.android.gui;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class NewMapActivity extends Activity 
{
    public ImageView    mapPreview;
    public Drawable     currentPic;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.newmap);

        currentPic = getResources().getDrawable(R.drawable.milestone_cleanenergy);
        mapPreview = (ImageView) findViewById(R.id.chooseCanvas);
        mapPreview.setImageDrawable(currentPic);
    }

    public void changePic(View view)
    {
        System.out.println("tester boy!!!!!!!!!!!");

        currentPic = null;
        currentPic = getResources().getDrawable(R.drawable.welcomescreen);
        mapPreview.setImageDrawable(currentPic);
    }
}

LogCat がクラッシュしたときのメッセージは次のとおりです。

06-13 21:25:56.613: D/dalvikvm(4086): GC_EXTERNAL_ALLOC freed 614 objects / 50072 bytes in 58ms
06-13 21:26:02.133: W/System.err(4086): java.io.FileNotFoundException: /sdcard/000.txt (No such file or directory)
06-13 21:26:02.143: W/System.err(4086):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
06-13 21:26:02.143: W/System.err(4086):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
06-13 21:26:02.143: W/System.err(4086):     at java.io.FileInputStream.<init>(FileInputStream.java:82)
06-13 21:26:02.143: W/System.err(4086):     at java.util.Scanner.<init>(Scanner.java:188)
06-13 21:26:02.143: W/System.err(4086):     at java.util.Scanner.<init>(Scanner.java:167)
06-13 21:26:02.143: W/System.err(4086):     at com.foocity.android.Map.<init>(Map.java:33)
06-13 21:26:02.143: W/System.err(4086):     at com.foocity.android.FooCity.setMap(FooCity.java:594)
06-13 21:26:02.143: W/System.err(4086):     at com.foocity.android.gui.StartActivity.chooseMap(StartActivity.java:33)
06-13 21:26:02.153: W/System.err(4086):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 21:26:02.153: W/System.err(4086):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 21:26:02.153: W/System.err(4086):     at android.view.View$1.onClick(View.java:2067)
06-13 21:26:02.153: W/System.err(4086):     at android.view.View.performClick(View.java:2408)
06-13 21:26:02.153: W/System.err(4086):     at android.view.View$PerformClick.run(View.java:8816)
06-13 21:26:02.153: W/System.err(4086):     at android.os.Handler.handleCallback(Handler.java:587)
06-13 21:26:02.153: W/System.err(4086):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-13 21:26:02.153: W/System.err(4086):     at android.os.Looper.loop(Looper.java:123)
06-13 21:26:02.153: W/System.err(4086):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-13 21:26:02.153: W/System.err(4086):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 21:26:02.153: W/System.err(4086):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 21:26:02.153: W/System.err(4086):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-13 21:26:02.153: W/System.err(4086):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-13 21:26:02.153: W/System.err(4086):     at dalvik.system.NativeStart.main(Native Method)
06-13 21:26:02.393: D/dalvikvm(4086): GC_EXTERNAL_ALLOC freed 3101 objects / 159528 bytes in 53ms
06-13 21:26:07.113: I/System.out(4086): tester boy!!!!!!!!!!!
06-13 21:26:07.123: E/dalvikvm-heap(4086): 9469350-byte external allocation too large for this process.
06-13 21:26:07.123: E/GraphicsJNI(4086): VM won't let us allocate 9469350 bytes
06-13 21:26:07.133: D/AndroidRuntime(4086): Shutting down VM
06-13 21:26:07.133: W/dalvikvm(4086): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-13 21:26:07.143: E/AndroidRuntime(4086): FATAL EXCEPTION: main
06-13 21:26:07.143: E/AndroidRuntime(4086): java.lang.IllegalStateException: Could not execute method of the activity
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.view.View$1.onClick(View.java:2072)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.view.View.performClick(View.java:2408)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.view.View$PerformClick.run(View.java:8816)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.os.Handler.handleCallback(Handler.java:587)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.os.Looper.loop(Looper.java:123)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at dalvik.system.NativeStart.main(Native Method)
06-13 21:26:07.143: E/AndroidRuntime(4086): Caused by: java.lang.reflect.InvocationTargetException
06-13 21:26:07.143: E/AndroidRuntime(4086):     at com.foocity.android.gui.NewMapActivity.changePic(NewMapActivity.java:30)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.view.View$1.onClick(View.java:2067)
06-13 21:26:07.143: E/AndroidRuntime(4086):     ... 11 more
06-13 21:26:07.143: E/AndroidRuntime(4086): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.Bitmap.nativeCreate(Native Method)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
06-13 21:26:07.143: E/AndroidRuntime(4086):     at android.content.res.Resources.getDrawable(Resources.java:581)
06-13 21:26:07.143: E/AndroidRuntime(4086):     ... 15 more

明らかにメモリ管理と関係がありますが、Java での監視には慣れていませんが、どうすればよいかわかりません。どんな助けでも大歓迎です。ありがとう

PS私はこれを投稿して、何か他のことを試みたことに気づきました(ファイルオブジェクトを作成してから、その内容をSystem.outに書き込みます)。新しいアクティビティがImageViewに最初のドローアブルをロードする前でも同じエラーが発生したため、すべてが必要です私は通常の Java でメモリ管理を行う GC に慣れているため、このシステムでメモリを管理する方法について助けが必要だと思います。

4

4 に答える 4

1
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

この行から、表示しようとしている画像が大きすぎることがわかります。画像のサイズを縮小して確認してみてください。

于 2012-06-13T21:57:04.073 に答える
0

最初に頭に浮かぶのは、ある画像を別の画像の上に描画しようとしていて、結果としてアプリがメモリ不足になっているということです。方法はわかりませんが、次の画像を描画する前に ImageView をクリアしてみてください。

編集:ビットマップを効率的に表示 するこれは、問題の解決に役立つはずです。

于 2012-06-13T21:47:52.563 に答える
0

06-13 21:26:07.123: E/dalvikvm-heap(4086): 9469350 バイトの外部割り当てがこのプロセスには大きすぎます。06-13 21:26:07.123: E/GraphicsJNI(4086): VM では 9469350 バイトを割り当てられません

これは、使用する画像リソースR.drawable.welcomescreenが大きすぎることを示しています (そのビットマップは ~9 MB かかります)。画像リソースを(「描画可能」フォルダーに入れる前に)縮小できると強く信じているので、それほど多くのメモリを必要としません。

于 2012-06-13T21:56:54.377 に答える
0

xml で android:src="@drawable/blah.jpg" を設定した最初のアクティビティの ImageView は、2 回目に行ったようなメソッドではなく。その行をxmlから削除し、2番目のアクティビティImageViewで行ったように、メソッドの最初のアクティビティにpicを設定すると、すべて正常に機能しました。問題は、なぜこれが機能したのかということです。xml に pic を設定すると、メモリ スペースが大量に消費されるのはなぜですか?

于 2012-06-14T01:05:13.907 に答える