如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章