gpt4 book ai didi

Android内存不足预防

转载 作者:IT王子 更新时间:2023-10-28 23:33:46 25 4
gpt4 key购买 nike

我有一个列表,其中显示了从网络上即时下载的缩略图(小图像)。在某些时候,该进程会耗尽内存。如何判断可用内存即将用完,从而停止下载更多图片?

我想提前知道,以免内存不足。

注意:这不是内存泄漏,只是大量下载的位图。

谢谢。

最佳答案

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

将拇指下载到 SDCard,而不是将它们保存在 RAM 中。在保存它们之前缩小/旋转它们,以便下次需要加载它们时,SDCard 的负载是“免费的”,而不是互联网上的昂贵负载。 (即:像任何浏览器一样,使用本地文件缓存)。

释放您为此创建的任何临时位图对象。

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

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

2) 创建分层缓存系统(Bitmap > SDCard > Internets)。

解压缩缩略图时,将其保存在 SoftReference 缓存中。如果您需要使用该缩略图,请从缓存中请求它。如果 VM 需要更多内存,您的 SoftReference 实例可能会返回 null。

如果您从位图缓存中获取 null,请检查您是否已将您的 url 放在 SD 卡上并从那里将其加载到位图缓存中。

如果您从文件系统中获取 null,则从 Internet 下载图像并将其保存到 SDCard 并将其粘贴到您的位图缓存中。

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

以同样的方式,确保在 View 离开屏幕后立即从 View 中清除位图(如果您的 View 位于 ListView 或其他基于适配器的元素中,这本质上是“免费的”回收 View 元素)-- 但是,如果您使用 Bitmap 实例化 ImageView 并且它们没有立即显示在屏幕上,那么您可能正在浪费堆。

您只需调用setImageBitmap(null);在 ImageView 上,并且对 Bitmap 的引用将被删除(因此,如果唯一的 ref 是未使用的 SoftReference)。

4) 注意你所在的线程。

请记住,您必须从非 UI 线程下载位图(我们使用服务实例作为 Intent 请求队列),并且您必须附加位图仅在 UI 线程中查看实例。

您需要创建一个良好的队列系统,将所有内容从 UI 线程加载到位图缓存中,然后使用 Handler 告诉您的位图缓存填充 UI 线程上的 ImageView。

5) 注意您的下载队列。

如果您像我们一样,同时拥有拇指全尺寸图片,您需要手动使用优先队列在拇指请求之前放置图片请求,或者使用两个不同的下载缩略图和完整图像的服务(将其单独的 Intent 排入队列)。

否则,您可能会在一个充满拇指下载的屏幕上排队,但直到所有拇指完成后才以完整图像响应。

6) 询问系统您有多少 RAM。

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

7) “onLowMemory()”没有达到您的预期。

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

这与耗尽应用程序 VM 堆完全分开,就像加载太多位图很容易做到的那样。

据我所知,您不会收到警告,只会崩溃(您可以通过上述调用跟踪内存信息)。

希望对尝试从互联网下载和显示拇指有所帮助。

米格

关于Android内存不足预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5579793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com