2013-01-11 39 views
1

我正在使用从我的应用程序下载的图像在后台显示的应用程序。当我启动应用程序时,它工作正常,加载图像没有任何问题。但是在几次重启之后,应用程序崩溃,出现内存错误。我使用下面的方法获取Drawable以在View中显示它。我已经使用了一个类,并且使用了这种静态方法,用于所有图像。我也调用另一个静态方法来清除位图,但不知道它是否有效。可能是我关闭应用程序时无法清除内存。Android应用程序在第二次或第三次启动后崩溃(显示内存错误)

public static void recycle_bitmap() { 
    if (myBitmap != null) { 
     myBitmap.recycle(); 
     myBitmap = null; 

    } 

    } 

    static Bitmap myBitmap = null; 

    public static Drawable ImgDrawableFromFile(Resources res, String file_name) { 

    myBitmap=null; 
    File imgFile = new File("/data/data/com.appstart/app_my_sub_dir/" 
      + file_name + ".jpg"); 
    if (imgFile.exists()) { 

     myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
     if (myBitmap != null) 
      return new BitmapDrawable(res, myBitmap); 
     else 
      return null; 
    } 
    return null; 

    } 

logcat的错误

01-11 12:09:41.860: D/dalvikvm(6047): GC_EXTERNAL_ALLOC freed 598K, 48% free     3336K/6407K, external 8683K/10523K, paused 274ms 
01-11 12:09:42.149: E/dalvikvm-heap(6047): 1671840-byte external allocation too large for this process. 
01-11 12:09:42.480: I/dalvikvm-heap(6047): Clamp target GC heap from 16.094MB to 16.000MB 
01-11 12:09:42.480: E/GraphicsJNI(6047): VM won't let us allocate 1671840 bytes 
01-11 12:09:42.501: D/dalvikvm(6047): GC_FOR_MALLOC freed 1K, 48% free 3334K/6407K, external 8674K/10523K, paused 247ms 
01-11 12:09:42.501: D/skia(6047): --- decoder->decode returned false 
01-11 12:09:42.501: W/dalvikvm(6047): threadid=15: thread exiting with uncaught exception (group=0x40015560) 
01-11 12:09:42.560: E/AndroidRuntime(6047): FATAL EXCEPTION: Thread-18 
01-11 12:09:42.560: E/AndroidRuntime(6047): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:309) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at com.appstart.utility.LoadImage.ImgDrawableFromFile(LoadImage.java:30) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at com.appstart.MainActivity.run(MainActivity.java:70) 
01-11 12:09:42.560: E/AndroidRuntime(6047):  at java.lang.Thread.run(Thread.java:1019) 
+0

请发布代码和logcat – user936414

+0

@ user936414我编辑了这个问题,添加了logcat错误 – nvavadiya

+0

你试过装置?我认为它不会影响.. – Deepzz

回答

1

遵循以下三个教程,以避免内存错误。

Avoid Memory Leaks

Attacking Memory Problems on Android

Future-Proofing Your App

,特别是使用静态变量很可能使事情变得更糟,而不是更好。 所以请删除它,并把它放在静态方法之外。

它可能是由于图像尺寸较大造成的。请将其缩小至较小尺寸。或增加您的Vm的堆积大小。

它可能会帮助你。

+0

我检查了这个教程,但不知道如何使用它在我的情况,因为我需要动态加载图像从静态应用程序资源,并不知道如何清除应用程序关闭时的内存 – nvavadiya

+0

我将替换静态变量,但有一个问题,我如何增加堆大小? – nvavadiya

+0

在odDestroymethod中添加bitmap.recycle我的问题解决了.. – nvavadiya

相关问题