在我的应用中,我有一个列表。 单击该列表中的项目后,将显示新视图。 在此视图中,我将显示徽标并运行一些音乐流。
根据Google建议使用加载图片资源的好方法加载徽标。 实际上,图像是通过我的服务器的URL加载的。但要显示我正在使用建议的方式。
我的应用程序仍然崩溃,实际上不是第一次加载图像时,但是当我返回列表时选择其他项目。在大约3-4次切换到另一个项目之后,应用程序最终因内存不足错误而崩溃!
我想,一旦视图被关闭,垃圾收集器将破坏加载的图像并将加载新图像...但我猜它仍然在内存中,并在几次加载后,它将崩溃,因为没有足够的记忆......
有人建议如何解决这个问题?是否有可能以某种方式清除记忆?
答案 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字节)的内存