Android内存不足的预防

我有一个列表,显示缩略图(小图片)从网上飞行下载。 在某个时候,这个过程耗尽了内存。 我怎么知道空闲的内存即将跑掉,所以我可以停止下载更多的图像?

我想提前知道这一点,以免出现内存不足的情况。

注意:这不是内存泄漏,只是很多下载的位图

谢谢。

Solutions Collecting From Web of "Android内存不足的预防"

1)你必须成为你自己的浏览器。

将您的拇指下载到SDCard中,而不是将它们保存在RAM中。 收缩/旋转它们,然后再保存它们,以便在下次需要加载它们时,SD卡上的“加载”是免费的,而不是来自Internet的昂贵。 (即:像任何浏览器,使用本地文件caching)。

释放您可能创build的任何临时Bitmap对象。

了解如何使用“ inSampleSize ”参数以小于原始分辨率的方式解压缩位图。

如果您写入的文件以图片扩展名(.jpg等)结尾,则它们将出现在图库中,因此不要用明显的图像文件名保存您的大拇指。

2)创build一个分层caching系统(位图> SDCard>互联网)。

解包缩略图时,请将其保存在SoftReferencecaching中。 如果您需要使用该缩略图,请从caching中获取。 如果VM需要更多内存,则您的SoftReference实例可能会返回null。

如果您从位图caching中获取空值,请检查是否已将url放在SD卡上,然后将其加载到位图caching中。

如果您从文件系统中获得空白,那么请从互联网下载图像并将其保存到SDCard中,并将其粘贴到位图caching中。

3)释放未被使用的资源。

以同样的方式,一旦视图不在屏幕上(如果你的视图生活在一个ListView或其他基于适配器的元素,这是从本质上“免费”的回收利用查看元素) – 但是,如果你有ImageViews实例化的位图,并没有立即显示在屏幕上,你可能是在浪费堆。

你可以直接调用setImageBitmap(null); 在ImageView上,对Bitmap的引用将被删除(所以如果唯一的参考是不被使用的SoftReference)。

4)注意你在什么线程。

请记住,您必须从非UI线程下载位图(我们使用Service实例充当意图请求的队列),并且只能在UI线程中将位图附加到View实例。

你需要创build一个好排队的系统来将所有的东西加载到UI线程的位图caching中,然后使用Handler来告诉你的位图caching在UI线程中填充ImageView。

5)注意你的下载队列。

如果你像我们一样,你有两个大拇指全尺寸的图像,你需要手动使用优先队列来请求你的图片请求之前,或使用两个不同的服务(排队他们单独的意图)下载大拇指vs完整的图像。

否则,您可能会排列一个充满拇指下载的屏幕,但直到所有的拇指完成之后才会用完整的图像进行响应。

6)询问系统有多lessRAM。

  Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo(); Debug.getMemoryInfo(memoryInfo); 

7)“ onLowMemory() ”不符合你的期望。

当用户在手机上运行的应用程序过多时,操作系统需要从所有正在运行的应用程序中恢复物理内存。

这完全与运行应用程序VM堆完全分开,就像加载太多的位图一样,您可以轻松完成。

据我所知,你不会得到一个警告,你只会崩溃(你可以通过上面的调用跟踪内存信息)。

希望有助于试图使下载和显示来自互联网的拇指聪明。

MIG

我使用SoftReference来保存位图对象。 该列表只需要当前的可见图像。 因此,我从不需要担心空间不足。

减号是,当我看到的图像,向下滚动(导致一些SoftReferences清除位图),然后再次滚回到相同的地方 – 图像再次下载:(

另外,SoftReference清除非常快。 我希望他们能够保存更长的内部位图。

创build位图时,您应该使用BitmapFactory.Options inSampleSize选项。

另外, Android中的一些提示:Gallery中的内存不足exception对于我保持可用内存的检查非常有用。

您可以onLowMemory() Activity的onLowMemory()方法来自定义处理这种情况