2012-06-13 65 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

所以我现在非常困惑,我在玩它,两种方式现在都在工作。我认为那是我改变的,但是谁知道问题是什么。但最终它现在工作得很好。只需等待,看看未来会发生什么。 –