Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android内存不足预防_Android_Memory_Download_Bitmap_Out Of Memory - Fatal编程技术网

Android内存不足预防

Android内存不足预防,android,memory,download,bitmap,out-of-memory,Android,Memory,Download,Bitmap,Out Of Memory,我有一个列表,上面显示了从web动态下载的缩略图(小图像)。 在某些时候,进程会耗尽内存。 如何判断可用内存即将耗尽,以便停止下载更多图像 我想提前知道,以免在记忆的边缘 注: 这不是内存泄漏,只是大量下载的位图 谢谢。您可以超越活动自定义处理此类场景的方法您应该在创建位图时使用BitmapFactory.Options的inSampleSize选项 此外,中的一些提示对我检查可用内存非常有用。我使用SoftReference保存位图对象。列表只需要当前可见的图像。因此,我从不需要担心空间不够用

我有一个列表,上面显示了从web动态下载的缩略图(小图像)。 在某些时候,进程会耗尽内存。 如何判断可用内存即将耗尽,以便停止下载更多图像

我想提前知道,以免在记忆的边缘

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


谢谢。

您可以超越活动自定义处理此类场景的方法

您应该在创建位图时使用
BitmapFactory.Options的
inSampleSize
选项


此外,中的一些提示对我检查可用内存非常有用。

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

缺点是,当我看到图像时,向下滚动(使一些软引用清除位图),然后再次滚动回同一位置-图像再次下载:(

此外,软引用被清除得非常快。我希望它们能将内部位图保存得更长。

1)您必须是自己的浏览器

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

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

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

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

2) 创建分层缓存系统(位图>SD卡>Internet)

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

如果位图缓存中的url为空,请检查是否已将url放在SD卡上,并从此处将其加载到位图缓存中

如果从文件系统中获取null,则从internet下载图像并将其保存到SD卡,然后将其粘贴到位图缓存中

3) 释放未被使用的资源

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

您只需调用
setImageBitmap(null)和对位图的引用将被删除(以便在不使用时,如果唯一的引用是SoftReference)

4) 注意你的思路

请记住,您必须从非UI线程下载位图(我们使用服务实例作为意图请求队列),并且必须将位图附加到UI线程中的视图实例

您需要创建一个良好的排队系统,将所有内容从UI线程加载到位图缓存中,然后使用处理程序通知位图缓存填充UI线程上的ImageView

5) 注意你的下载队列

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

否则,您可能会在一个满是thumb下载的屏幕上排队,但在所有thumb下载完成之前,您不会以完整图像作出响应

6) 询问系统您有多少RAM

  Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
  Debug.getMemoryInfo(memoryInfo);
7) “
onLowMemory()
”没有达到预期效果

它适用于用户在手机上运行过多应用程序,并且操作系统需要从所有正在运行的应用程序中恢复物理内存的情况

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

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

希望这有助于尝试从互联网上下载和显示拇指的智能化


米格

我会详细阐述一下。为了避免多次下载每个图像,我将下载的图像缓存在活动中,并替换旧图像-LRU。我想知道什么时候停止缓存或绑定LRU的大小。我也遇到了同样的问题,我尝试了软引用和其他方法……不管大小如何,如果我有太多的图像,最终进程会耗尽内存。当然。最终,你必须停在有限数量的图像上。问题应该是如何尽可能地提高这一限制。我不想达到这一点,而是定义这样的内容:如果使用的内存达到80%,停止缓冲缓存。我没有调用此方法,只需接收OOM异常。在OOM-1之前未调用onLowMemory():onLowMemory用于总内存消耗,在所有应用程序之间。这不是这里的问题。相反,这个应用程序正在达到它的堆限制。onLowMemory不会有帮助。答案非常类似:现在,使用LruCache而不是软引用。为了避免您遇到的问题,您需要比预期更积极地清除引用。重复使用“软参考”。现在,建议改为使用LruCache“过去,一种流行的内存缓存实现是SoftReference或WeakReference位图缓存,但不建议这样做。St