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

Codenameone 减少内存中视频的影响以防止崩溃,codenameone,Codenameone,我有一个可能包含大量图像和视频的应用程序,这取决于用户发布的帖子数量 由于已经在开发中,包含图像和视频标签的帖子相对较少,我担心由于内存使用过多,该应用程序偶尔会在真实设备上崩溃 是否有优化资源使用的技巧和策略 至于图像,我只使用中等分辨率的常规图像(没有多幅图像),作为固定大小标签的背景 至于视频,我只使用短视频 至于帖子和视频(位于具有许多选项卡的复杂多层层次结构中),我使用自己的自定义版本的InfiniteContainer,与“默认”版本不同,它在刷新期间从不使用“removeAll”,

我有一个可能包含大量图像和视频的应用程序,这取决于用户发布的帖子数量

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

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

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

至于视频,我只使用短视频

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

垃圾收集器的工作是处理视频吗

我不清楚Media.cleanup()是否对视频起作用


感谢您的建议。

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

EncodedImage
适用于未显示的图像。当显示它们时,它们被“锁定”并占用大量内存。在那一点上,他们无法获得GC'd。确保无限容器解锁不再是其一部分的组件。如果您继续向无限容器中添加内容,最终会耗尽RAM。你对此无能为力

图像在使用时会显示“”(例如,以当前形式显示,但不一定可见)。表单有责任解锁它们,否则图像根本不会是GCd。您可以使用
isLocked()
确定编码图像是否占用全部RAM。请注意,未锁定的图像可能会表现得很差,因为它们会重击GC,所以请轻点使用此

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


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

你能给我一些进一步的解释吗?也许我不明白。如果我在表单中使用EncodedImage,当mage不再显示,因为我更改了表单(但保留了对有问题的EncodedImage的引用,在这种情况下,在内存中保留一个包含EncodedImage的InfiniteContainer变量),EncodedImage是否会自动从RAM中删除,直到再次显示?我的假设是否对EncodedImages无效,而仅对FileEncodedImageAsync有效?此外,我不知道视频的FileEncodedImageAsync存在什么等效项。我应用了您的建议,在播放视频时用视频预览标签替换所有MediaPlayer暂停:在亮度方面的优势似乎非常显著,并为我解决了一些问题。顺便说一句,这是解决问题的有效方法,比我提出的解决方案要好得多。我添加了一些澄清的评论。我记得写过很多关于图像锁定的文章,但我找不到它。第一印象是使用FileEncodedImageAsync+image.unlock()解决了我的应用程序崩溃问题。我将在开发过程中进行更多测试,但这似乎是一条可行之路。我注意到,在滚动大量内容后,InfiniteContainer的滚动速度会减慢很多,持续一到两秒:这可能是GC从不可避免的崩溃中拯救出来的时刻。可能是使用InfiniteContainer的时候解锁几乎是必须的?这可能是因为解锁。当您解锁并需要再次显示图像时,会有开销。您还应该在图像位于可见区域时将其锁定,以防止GC不断收集图像。