所以我正在寫一個軟件,當我嘗試創建第二個drawable時,它會一直崩潰。它從前面的屏幕上開始,然後我按下一個按鈕,它會轉到一個新的活動。在那個活動中,我有一個ImageView在中間和一個按鈕在底部。當活動加載時,ImageView中有一個可繪製的。所以當我點擊底部的按鈕時,它應該改變ImageView中的drawable,但它會崩潰。我發現,在logcat的是說這樣的錯誤:在ImageView中更改drawable崩潰android app
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,但我不確定該怎麼做。任何幫助,將不勝感激。謝謝
P.S.我意識到發佈這個,我嘗試了其他的東西(創建一個文件對象,然後把它的內容寫入System.out),並且它甚至在新活動加載ImageView中的第一個drawable之前引發了同樣的錯誤,所以它必須有一切可以做在內存管理方面,我想我需要關於如何在這個系統中管理內存的幫助,因爲我已經習慣於使用常規Java來處理GC。
我不這麼認爲,就像我在最後說的那樣,當我創建一個File對象並將其寫入System.out時,該程序甚至會在它到達ImageView之前崩潰。另外當我運行:currentPic = null;然後currentPic = getResources()。getDrawable(R.drawable.blah);並使用調試會話它甚至在運行mapPreview.setImageDrawable(currentPic)之前給我關於內存分配的錯誤;所以它與內存管理有關,但不是將ImageView上的另一張圖片放在另一張圖片上的具體想法。 –
如果是這種情況,那麼圖像顯然太大了。據我所知,無法增加分配給應用程序的內存量。 – cDecker32