Android 是否在UI线程上调用了`ontrimmory`?

Android 是否在UI线程上调用了`ontrimmory`?,android,memory-management,android-lifecycle,Android,Memory Management,Android Lifecycle,我想在一个活动中实现ontrimmory(int-level),将内存中的一些Bitmap对象写入硬盘,并循环使用它们。但是我不确定这是否会阻止UI线程,我应该在另一个线程中运行代码吗?或者默认情况下,该方法已在另一个线程上运行 另一个相关问题是:ontrimmory在活动处于前台时是否会被调用?医生说: 换句话说,如果我正确地实现了ontrimmory(释放足够的内存),我需要担心OOM错误吗 或者,只有当活动进入后台时,才会调用ONTRIMEMORY,因此当应用程序位于前台时,OOM仍然可

我想在一个活动中实现
ontrimmory(int-level)
,将内存中的一些
Bitmap
对象写入硬盘,并循环使用它们。但是我不确定这是否会阻止UI线程,我应该在另一个线程中运行代码吗?或者默认情况下,该方法已在另一个线程上运行

另一个相关问题是:
ontrimmory
在活动处于前台时是否会被调用?医生说:

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


或者,只有当活动进入后台时,才会调用ONTRIMEMORY,因此当应用程序位于前台时,OOM仍然可能发生?

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

对。从:

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

如果您希望从源代码获得保证,请注意调用的根发生;一个
Runnable
发布到
ActivityThread的
main
处理程序

2。当活动位于前台时,
ontrimmory
是否会被调用?

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

在源代码中,它看起来可能应用于前台应用程序

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

您总是需要担心OOM错误。总是可以请求大于系统所能提供的分配。
ontrimmory()
方案反映了一种在“尽力而为”的基础上释放资源的方法;无法保证您的应用程序或系统上的其他应用程序会合作达到任何特定的内存阈值

如果你的应用在后台,它可能不会做太多,特别是在分配方面。也许你应该担心的是你设备上的其他应用程序出现OOM(如果你的应用程序无法释放“足够”的内存来响应
ontrimmory()
调用)

4。或者
ontrimmory
仅在活动进入后台时调用,因此当应用程序位于前台时,OOM仍然可能发生?

如前所述,OOM可以在您尝试进行分配的任何时候发生。希望您设备上的其他应用程序能够真诚地减少内存消耗(在
ontrimmory()
之后),以便为您的前台应用程序提供最大数量的可用资源。如果不这样做,它们很可能会被终止(正如您从ActivityManagerService.java中的逻辑可以看到的那样),这将释放更多的资源

系统将尽最大努力确保你的前台应用程序拥有它请求的资源。这就是说,您应该以合理的方式规划内存使用,并能够在发生错误(OOM)时正常恢复