Android 应用程序在第二次或第三次启动后崩溃(显示内存错误)

标签 android memory bitmap

我正在开发使用从我的应用程序下载的图像在后台显示的应用程序。当我启动应用程序时,它工作正常并且加载图像没有任何问题。但是在几次重启后应用程序因内存错误而崩溃。我使用下面的方法获取 Drawable 以在 View 中显示它。我使用了一个类,其中有这个静态方法,我将它用于所有图像。我还调用了另一个静态方法来清除位图,但不知道它是否有效。可能是我在关闭应用程序时无法清除内存。

    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)

最佳答案

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

Avoid Memory Leaks

Attacking Memory Problems on Android

Future-Proofing Your App

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

这也可能是由于图像尺寸过大造成的。请将其缩小到较小的尺寸。或者增加您的 Vm 的堆大小。

它可能对你有帮助。

关于Android 应用程序在第二次或第三次启动后崩溃(显示内存错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273212/

相关文章:

java - Android服务类变量

Android 位图对象作为绘制缓冲区

c - 为什么你会想要在堆上有一个数组?

c++ - 使用 malloc 分配比现有内存更多的内存

android - 使用 lrucache 和 asynctask 不显示位图

android - BufferedImage 安卓端口

java - Tabhost 不显示标签

javascript - toExpontial 在 React Native 中未定义

android - 错误 :Failed to open zip file. Gradle 的依赖缓存可能已损坏

android - 以编程方式在 TextView 下画线