- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个列表,其中显示了从网络上即时下载的缩略图(小图像)。在某些时候,该进程会耗尽内存。如何判断可用内存即将用完,从而停止下载更多图片?
我想提前知道,以免内存不足。
注意:这不是内存泄漏,只是大量下载的位图。
谢谢。
最佳答案
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/
所以我正在为考试复习,并在 SQL 河(或荒地)中撞到了一块大石头 我制作了以下表格并插入了以下数据: create table Permissions ( fileName VARCHAR(
我有一个使用 maxWidth 定义的 jqueryui 对话框。 $("#myDialog").dialog({ autoOpen: false, width: 'a
注意:我遗漏了不相关的代码 所以我目前正在研究 CCC 1996 P1,这个问题的全部目的是能够计算一个整数输入是完美数、不足数还是充数。我上面列出的代码可以工作,但是我认为它太慢了。该代码会迭代每个
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在使用 Go 和 Redis 开发 API。问题是RAM使用不足,我找不到问题的根源。 TL;DR 版本 有数百/数千个哈希对象。每个 1 KB 的对象(键+值)占用大约 0.5 MB 的 RAM
在我的 GCE Kubernetes 集群上,我无法再创建 pod。 Warning FailedScheduling pod (www.caveconditions.com-f1be467e3
当我尝试在EKS Fargate群集上安装指标服务器时,它抛出错误: 0/4 nodes are available: 4 Insufficient pods. 按照以下说明从此处安装指标服务器:ht
遍布this document Apple 提到 iOS 在某些情况下会终止应用程序,最常见的原因似乎是释放一些 RAM。这会导致未实现状态恢复的应用程序出现问题——用户正在处理和暂时离开的一些内容可
尝试处理一个10分钟的音频文件时出现以下错误。我刚刚开始使用Google Cloud产品,所以我是唯一访问此资源的人。我怎么可能超出配额?配额设置为其默认值,我认为我没有任何限制。还有其他原因吗? 我
R 语言让我感到困惑。实体有模式和类,但即使这样也不足以完全描述实体。 这个answer说 In R every 'object' has a mode and a class. 所以我做了这些实验:
我在 west-1 有一个 Openshift v3 项目。在其中,我有一个运行良好的应用程序,但在 GitHub 提交代码中非常下游的内容后,该应用程序停止工作。问题在于制作 pod: No nod
我在 west-1 有一个 Openshift v3 项目。在其中,我有一个运行良好的应用程序,但在 GitHub 提交代码中非常下游的内容后,该应用程序停止工作。问题在于制作 pod: No nod
在 how-do-i-access-the-stackoverflow-api-from-mathematica我概述了如何使用 SO API 让 Mathematica 制作一些有趣的顶级回答者声誉
所以在 GKE 上,我有一个 Node.js app,每个 pod 使用大约:CPU(cores): 5m, MEMORY: 100Mi 但是我只能为每个 Node 部署 1 个 pod。我使用的是
我正在使用 async.eachOfSeries 超过 300 个数组并请求一些 GA api,它工作正常但有时我会收到错误.. UnhandledPromiseRejectionWarning:错误
我正在尝试在 AWS ec2 上托管的 kubernetes 集群上使用 mr3 设置配置单元。当我运行命令 run-hive.sh 时,Hive 服务器启动,并且 master-DAg 被初始化,但
创建订阅时有时会出现以下错误: Insufficient tokens for quota 'administrator' and limit 'CLIENT_PROJECT-100s' of ser
我是一名优秀的程序员,十分优秀!