繁体   English   中英

是否在UI线程上调用`onTrimMemory`?

[英]Does `onTrimMemory` get called on UI thread or not?

我想在活动中实现onTrimMemory(int level) ,以便将内存中的某些Bitmap对象写入硬盘,然后回收它们。 但是我不确定这是否会阻塞UI线程,是否应该在另一个线程中运行代码? 还是默认情况下该方法已在另一个线程上运行?

另一个相关的问题是:活动处于前台时会调用onTrimMemory吗? 医生说:

例如,当它在后台运行并且没有足够的内存来保持所需的尽可能多的后台进程运行时,就会发生这种情况。

换句话说,如果我正确实现onTrimMemory (释放足够的内存),是否需要担心OOM错误?

还是onTrimMemory仅在活动进入后台时才被调用,所以当应用程序在前台时仍会发生OOM吗?

1. onTrimMemory是否在UI线程上被调用?

是。 文档

...响应系统回调(例如onKeyDown()以报告用户操作或生命周​​期回调方法)的方法始终在流程的UI线程中运行。

如果您希望从源代码获得保证,请注意,调用的根源在此处进行 一个发布到ActivityThread'sHandlerRunnable

2.活动处于前台时会调用onTrimMemory吗?

我不确定。 文档没有明确禁止它,因此设计良好的应用程序应允许这种可能性。

看起来源代码中的此调用可能会应用于前台应用程序。

3.如果我正确实现onTrimMemory (释放足够的内存),是否需要担心OOM错误?

您始终需要担心OOM错误。 总是有可能要求分配比系统可提供的更大的分配。 onTrimMemory()方案反映了一种“尽最大努力”释放资源的方法。 不能保证您的应用程序或系统上的其他应用程序可以配合使用以达到任何特定的内存阈值。

如果您的应用程序在后台运行,则可能不会做太多事情,尤其是在分配方式方面。 也许您应该担心设备上的其他应用程序正在获得OOM(如果您的应用程序无法响应onTrimMemory()调用而释放“足够”的内存)。

4.还是仅在活动进入后台时才调用onTrimMemory ,所以当应用程序位于前台时,OOM仍然会发生吗?

如前所述,OOM可以在您尝试进行分配时发生。 希望设备上的其他应用程序将尽最大的努力减少它们的内存消耗(在onTrimMemory() ),以便最大程度地为前台应用程序提供资源。 如果没有,它们很可能会被终止(从ActivityManagerService.java中的逻辑可以看到),这将释放更多的资源。

系统将尽力确保您的前台应用程序具有其所请求的资源。 也就是说,您应该以合理的方式计划内存使用,并能够在出现错误(OOM)时正常恢复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM