Android Bitmap OutOfMemory

时间:2013-10-15 11:13:46

标签: java android bitmapimage

在我的应用中,我有一个列表。 单击该列表中的项目后,将显示新视图。 在此视图中,我将显示徽标并运行一些音乐流。

根据Google建议使用加载图片资源的好方法加载徽标。 实际上,图像是通过我的服务器的URL加载的。但要显示我正在使用建议的方式。

我的应用程序仍然崩溃,实际上不是第一次加载图像时,但是当我返回列表时选择其他项目。在大约3-4次切换到另一个项目之后,应用程序最终因内存不足错误而崩溃!

我想,一旦视图被关闭,垃圾收集器将破坏加载的图像并将加载新图像...但我猜它仍然在内存中,并在几次加载后,它将崩溃,因为没有足够的记忆......

有人建议如何解决这个问题?是否有可能以某种方式清除记忆?

5 个答案:

答案 0 :(得分:0)

尝试在不再需要位图时添加此代码:

bitmap.recycle();

确保在执行此操作时没有视图引用位图。

这将立即释放分配给位图的所有内存。

希望这会有所帮助:)

答案 1 :(得分:0)

如果您的最低版本的sdk为11或更高,请尝试此操作

将以下内容添加到清单

中的应用标记中
android:largeHeap="true"

希望它会对你有所帮助。

答案 2 :(得分:0)

将以下代码添加到您的位图。

   BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize=2;

                Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, options);

并且也执行此代码

 Bitmap  correctBmp = Bitmap.createBitmap(bmp, 0, 0, 100, 100, mat, true);

您可以根据所需的图像质量更改值100,100。

答案 3 :(得分:0)

确保在使用新的位图图像之前,回收现有的位图

并使用 setImageDrawable(null);

试试这个,

 ImageView mImage;// YOUR IMAGEVIEW

    Drawable toRecycle = mImage.getDrawable();
            if ( toRecycle != null && toRecycle instanceof BitmapDrawable ) {
                if ( ( (BitmapDrawable) mImage.getDrawable() ).getBitmap() != null )
                    ( (BitmapDrawable) mImage.getDrawable() ).getBitmap().recycle();
            }
   mImage.setImageDrawable( null );

答案 4 :(得分:0)

位图实际上是大型对象,因此您必须小心加载它们。阅读开发者网站here上的指南。它告诉您如何确保系统仅加载真正需要的像素。如果加载整个图像,则可能会出现内存不足异常。例如,5MP图像将使用高达20MB(每个像素4字节)的内存