如何使用 Android 缓存视图并避免每次都调用 onCreate

Posted

技术标签:

【中文标题】如何使用 Android 缓存视图并避免每次都调用 onCreate【英文标题】:How to cache views with Android and avoid calling onCreate everytime 【发布时间】:2010-10-22 00:45:15 【问题描述】:

我有一个让我很烦恼的问题。

对于 android,我有一个应用程序似乎在每次创建一个新的活动实例时调用onCreate,因为这个活动是另一个活动的儿子,它在结束其角色的同时完成自己一条数据。

onCreate 的每次调用似乎都是重新解析 XML 以创建视图并将侦听器重新附加/重新创建代码等等。那么有没有一种方法可以缓存每次调用的活动,如果我们单击移动设备中的后退按钮而不会看到它?这就像将它真正隐藏起来(无法通过后退按钮访问)并仅在必要时销毁。

提前谢谢大家:)

【问题讨论】:

【参考方案1】:

Android 将处理大多数适用的视图和活动缓存,您不必担心它。我强烈警告不要使用 alexkipar 的方法。这是非常幼稚的,只会降低性能并造成内存泄漏和错误行为。

如果您觉得 Activity 的创建过于频繁,我建议您确保正确使用和理解 Activity 生命周期。与每个系统一样,Android 在效率和可重用性之间取得平衡,并且总是需要做出权衡。

您提到的一个常见误解涉及解析 XML。用于视图的 XML 不是作为纯 XML 存储的,而是为了提高效率而以编译的形式存储的。您不必担心这一点,相信系统正在努力使事情尽可能高效。

【讨论】:

【参考方案2】:

如果它被调用,则意味着您的进程已完成执行或被系统杀死。

每次您的活动开始时都会调用onCreate。这就是Activity lifecycle 的工作方式,您无能为力。

如果您希望您的进程保留在内存中,那么您应该考虑将其实现为Service。

【讨论】:

谢谢你的回答,但正如我所说,我每次调用“onCreate”都没有问题,但我想在活动中放大我的视图并附加监听器一次。因此,通过避免调用完成似乎是可能的,但它给了我在点击模拟器中的“后退”按钮时获取所有视图的副作用。【参考方案3】:

您不能阻止在每次创建 Activity 时调用 onCreate,因为这是事情的工作方式。

您的问题更多是架构问题:您有一个经常使用的功能,但您为此投入了大量繁重的活动。

如果您正在寻找速度和响应能力,答案可以是ViewFlipper。您定义了一个独特的活动,当您使用您的功能时,您只需更改视图。您的整个应用程序在一开始就被加载,然后它会一直保留在内存中,直到 Dalvik 需要一些。您可以在开源应用程序astrid 的代码中找到一个相当复杂的示例。

【讨论】:

以上是关于如何使用 Android 缓存视图并避免每次都调用 onCreate的主要内容,如果未能解决你的问题,请参考以下文章

android如何跨片段分离/附加保留视图状态

如何避免在Reactjs中每次都调用API?

Android开发系列之ListView

如何避免在android中的relativelayout中重叠视图

Flask 扩展 缓存

如何使用 Jetpack Compose UI 在 Android 上正确跟踪屏幕视图?