Android 活动内存未清除
出于某种原因,我的android应用程序在其活动完成时似乎没有正确释放BitmapFactory分配的空间。我的应用程序由两部分组成,一部分是缩略图查看器,第二部分是图像查看器。当按下缩略图时,图像查看器(主要是使用带有ImageView的片段的FragmentStatePagerAdapter)活动将启动。当退出图像查看器时,似乎所有当前加载到记忆棒中的位图都在附近,即使我事后调用System.gc() 我之所以认为是这样,是因为如果我重复进入一个图像的查看器,然后离开它,然后一遍又一遍地进入同一个图像,最终程序崩溃,说它内存不足。在有人指点我之前,我向你保证,这不是样本大小的问题。我可以安全地说,因为我可以加载相同的图像而没有问题,但是如果我尝试关闭它并再次加载足够的次数,那就是我得到OOM错误的时候 以前有人见过这样的问题吗?我尝试过手动卸载位图,但似乎我所做的一切都没有释放内存。有人能告诉我一些RAM分析工具或者告诉我如何手动清理这些位图吗Android 活动内存未清除,android,bitmap,out-of-memory,ram,Android,Bitmap,Out Of Memory,Ram,出于某种原因,我的android应用程序在其活动完成时似乎没有正确释放BitmapFactory分配的空间。我的应用程序由两部分组成,一部分是缩略图查看器,第二部分是图像查看器。当按下缩略图时,图像查看器(主要是使用带有ImageView的片段的FragmentStatePagerAdapter)活动将启动。当退出图像查看器时,似乎所有当前加载到记忆棒中的位图都在附近,即使我事后调用System.gc() 我之所以认为是这样,是因为如果我重复进入一个图像的查看器,然后离开它,然后一遍又一遍地进入
谢谢 首先,确保您正在缩放位图,并且位图本身不会太大,这是最重要的,内存泄漏就是泄漏,但是如果位图占用10mb,那么泄漏就不必担心了 为了正确地清理位图,我的例子是Xamarin Android,所以你需要做一些轻微的转换,但所有东西的名称都应该相同,你需要首先获得imageview或任何你有位图的容器,然后你需要获得可绘制的项目,接下来,你需要确保可绘制的是位图,然后,您需要检查该位图是否已回收,如果尚未回收,则需要将imageviews位图设置为null,重新设置位图的样式,清空位图,然后调用Java垃圾回收器,这就是代码对我的作用:
public void CleanBitmap()
{
ImageView imageView = (ImageView)FindViewById(Resource.Id.myImage);
Drawable drawable = imageView.Drawable;
if (drawable is BitmapDrawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
if (bitmapDrawable.Bitmap != null)
{
Bitmap bitmap = bitmapDrawable.Bitmap;
if (!bitmap.IsRecycled)
{
imageView.SetImageBitmap(null);
bitmap.Recycle();
bitmap = null;
}
}
}
Java.Lang.JavaSystem.Gc();
}
这将释放所有内存,删除对位图的任何引用,并允许垃圾收集器遍历并释放这些位图。是否在位图上调用recycle()。@rickfalk我还没有。我试过一次,但似乎没有任何效果。什么时候调用recycle()?完成后?在链接到的页面上,单击底部附近的“管理位图内存”链接