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

时间:2019-02-24 16:21:24

标签: android memory-management android-lifecycle

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

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

This will happen for example when it goes in the background and there is not enough memory to keep as many background processes running as desired.

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

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

1 个答案:

答案 0 :(得分:1)

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

是的。来自docs

  

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

如果您希望从源代码获得保证,请注意,调用的根发生在here处; Runnable发布到ActivityThread'sHandler上。

2。活动处于前台时,onTrimMemory会被呼叫吗?

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

看起来源代码中的this call可能适用于前台应用。

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

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

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

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

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

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