减少视频在内存中的影响以防止崩溃

Reduce the impact of videos in memory to prevent crashes

我的应用程序可能包含大量图片和视频,具体取决于用户发布的帖子数量。

已经在开发中,包含图片和视频标签的帖子相对较少,应用程序偶尔会在真实设备上崩溃,我担心内存使用过多。

是否有任何优化资源使用的技巧和策略?

至于图像,我只使用中等分辨率的常规 EncodedImages(没有多图像)作为固定大小标签中的背景。

关于视频,我只用短视频。

至于帖子和视频(它们位于具有许多选项卡的复杂多层层次结构中),我使用我自己的 InfiniteContainer 自定义版本,与“默认”版本不同,它在刷新期间从不使用“removeAll”,而只是添加新帖子(如果有):这已经在性能方面给了我很大的好处。我还尝试重用充满图像和视频的 InfiniteContainer 的同一个实例,因此我不必每次都重新创建 Media 实例:在这种情况下也有性能优势,但所有内容都保留在内存中。

垃圾收集器会处理视频吗?

我不清楚 Media.cleanup() 是否对视频做了什么。

感谢您的建议。

我建议使用 Android 内存分析器来尝试跟踪潜在的内存泄漏和此类泄漏的来源。您还可以在模拟器上使用内存跟踪,但这更具挑战性,因为存储在“本机系统”中的一些开销将对基于 Java 的分析器隐藏。

EncodedImage 非常适合未显示的图像。当它们被显示时,它们被“锁定”并占用大量 RAM。那时他们无法获得GC。确保你的无限容器解锁不再属于它的组件。如果你不断地向无限容器中添加东西,你最终会 运行 内存不足。你对此无能为力。

图像在使用时会显示“locked”(例如,以当前形式但不一定可见)。解锁它们是表单的责任,否则图像根本不会被 GCd。您可以使用 isLocked() 来确定编码图像是否占用了全部 RAM。请注意,未锁定的图像可能会表现得很差,因为它们会破坏 GC,所以请小心处理这个...

我建议将 FileEncodedImageAsync 用于数据,这样文件就可以从 RAM 中完全删除,并将其用于视频(使用缩略图。我建议仅在播放开始时放置视频本身。

EncodedImage 的区别在于:即使是 GCd,EncodedImage 也会保留“编码”部分(PNG、JPEG 数据)。 FileEncodedImageAsync 具有 FileSystem 中的数据,因此缓存可以作为文件进行管理。此外,假设图像未锁定,图像仅占用 RAM 中图像文件的名称。