2012-06-13 114 views
0

所以我正在寫一個軟件,當我嘗試創建第二個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。

回答

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

從這一行可以看出,您嘗試顯示的圖片尺寸過大。嘗試減小圖像的大小並查看。

0

想到的第一件事就是你試圖在另一個圖像上繪製一個圖像,結果導致你的應用程序內存不足。我不確定如何,但在繪製下一張圖像之前嘗試清除ImageView。

編輯:Displaying Bitmaps efficiently 這應該有助於你解決你的問題。

+0

我不這麼認爲,就像我在最後說的那樣,當我創建一個File對象並將其寫入System.out時,該程序甚至會在它到達ImageView之前崩潰。另外當我運行:currentPic = null;然後currentPic = getResources()。getDrawable(R.drawable.blah);並使用調試會話它甚至在運行mapPreview.setImageDrawable(currentPic)之前給我關於內存分配的錯誤;所以它與內存管理有關,但不是將ImageView上的另一張圖片放在另一張圖片上的具體想法。 –

+0

如果是這種情況,那麼圖像顯然太大了。據我所知,無法增加分配給應用程序的內存量。 – cDecker32

0

06-13 21:26:07.123:E/dalvikvm堆(4086):9469350字節外部分配太大這一過程。 06-13 21:26:07.123:E/GraphicsJNI(4086):虛擬機不會讓我們分配9469350個字節

這告訴你的R.drawable.welcomescreen使用圖像資源過大(其位取〜 9 MB)。我堅信你可以縮小圖像資源(在把它放到「drawable」文件夾之前),所以它不佔用太多內存。

+0

所以,這不是問題。這些圖片實際上只有大約350kB,並且它們的大小相加,但我確實解決了這個問題。所以第一個活動(我在哪裏按下按鈕進入第二個活動)也有一個圖片,但我對它進行了不同的設置。我在第一個活動中使用android:src =「@ drawable/blah.jpg」設置了xml,而不是像第二次那樣使用方法。當我從xml中刪除該行並在像第二個活動ImageView那樣的方法中的第一個活動上設置圖片時,一切正常。我現在的問題是爲什麼這樣做? –

0

ImageView上的第一個活動是我在android中使用android:src =「@ drawable/blah.jpg」在xml中設置的,而不是像第二次那樣使用方法。當我從xml中刪除該行並在像第二個活動ImageView那樣的方法中的第一個活動上設置圖片時,一切正常。現在的問題是爲什麼這個工作?爲什麼在xml中設置圖片會佔用更多的內存空間?

+0

所以我現在非常困惑,我在玩它,兩種方式現在都在工作。我認爲那是我改變的,但是誰知道問題是什麼。但最終它現在工作得很好。只需等待,看看未來會發生什麼。 –