1) 你必须是你自己的浏览器。
将拇指下载到 SDCard,而不是将它们保存在 RAM 中。在保存它们之前缩小/旋转它们,以便下次需要加载它们时,SDCard 中的负载是“免费的”,而不是互联网上的昂贵负载。 (即:像任何浏览器一样,使用本地文件缓存)。
释放您为此创建的任何临时位图对象。
了解如何使用“inSampleSize”参数以低于原始分辨率的分辨率解压缩位图。
如果您编写的文件以图像扩展名(.jpg 等)结尾,它们将出现在图库中,所以不要用明显的图像文件名保存您的拇指。
2) 创建分层缓存系统(Bitmap > SDCard > Internets)。
解压缩缩略图时,将其保存在 SoftReference 缓存中。如果您需要使用该缩略图,请从缓存中请求它。如果 VM 需要更多内存,您的 SoftReference 实例可能会返回 null。
如果您从位图缓存中获取 null,请检查您是否已将您的 url 放在 SD 卡上并从那里将其加载到位图缓存中。
如果您从文件系统中获取 null,则从 Internet 下载图像并将其保存到 SDCard 并将其粘贴到您的位图缓存中。
3) 释放未被使用的资源。
以同样的方式,确保在视图离开屏幕后立即从视图中清除位图(如果您的视图位于 ListView 或其他基于适配器的元素中,这本质上是“免费的”回收 View 元素)-- 但是,如果您使用位图实例化了 ImageView,并且它们没有立即显示在屏幕上,那么您可能正在浪费堆。
您可以简单地在 ImageView 上调用 setImageBitmap(null);,然后对 Bitmap 的引用将被删除(这样,如果唯一的 ref 是未使用的 SoftReference)。
4) 注意你所在的线程。
请记住,您必须从非 UI 线程下载位图(我们使用服务实例作为意图请求队列),并且您必须附加位图仅在 UI 线程中查看实例。
您需要创建一个良好的队列系统,将所有内容从 UI 线程加载到位图缓存中,然后使用 Handler 告诉您的位图缓存填充 UI 线程上的 ImageView。
5) 注意您的下载队列。
如果您像我们一样拥有拇指和全尺寸图片,您需要手动使用优先队列在拇指请求之前放置图片请求,或者使用两个不同的下载缩略图和完整图像的服务(将其单独的 Intent 排入队列)。
否则,您可能会在一个充满拇指下载的屏幕上排队,但直到所有拇指都完成后才以完整图像响应。
6) 询问系统您有多少 RAM。
Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memoryInfo);
7) “onLowMemory()”没有达到你的预期。
当用户在手机上运行太多应用程序并且操作系统需要从所有正在运行的应用程序中恢复物理内存时。
这与耗尽应用程序 VM 堆完全分开,就像加载太多位图很容易做到的那样。
据我所知,您不会收到警告,只会崩溃(您可以通过上述调用跟踪内存信息)。
希望对尝试从互联网下载和显示拇指有所帮助。
米格