-2

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

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

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

我想,一旦视图被关闭,垃圾收集器将销毁加载的图像,只会加载新的图像......但我猜它会保留在内存中,加载几次后,它会因为内存不足而崩溃...

任何人有一些建议如何解决这个问题?是否有可能以某种方式自己清除内存?

4

5 回答 5

0

当您不再需要位图时,请尝试添加此代码:

bitmap.recycle();

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

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

希望这可以帮助 :)

于 2013-10-15T11:16:38.820 回答
0

试试这个,如果你的 sdk 最低版本是 11 或更高,

将以下内容添加到清单中的应用程序标记中

android:largeHeap="true"

希望它会帮助你。

于 2013-10-15T11:16:54.213 回答
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。

于 2013-10-15T11:20:02.553 回答
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 );
于 2013-10-15T11:21:05.137 回答
0

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

于 2013-10-15T11:29:54.657 回答