【问题标题】:Finally, where is it better to persist data on android, onPause() or onStop()?最后,在 android、onPause() 或 onStop() 上持久化数据在哪里更好?
【发布时间】:2021-05-22 00:43:15
【问题描述】:

我在某些地方看到可以(甚至建议)在 onPause() 方法中持久化数据。

喜欢这里

https://stackoverflow.com/a/41778266/3913107

这里

https://stackoverflow.com/a/29496430/3913107

但是,文档指出:

onPause() 执行时间很短,而且不一定负担得起 足够的时间来执行保存操作。为此,您应该 不要使用 onPause() 来保存应用程序或用户数据,建立网络 调用或执行数据库事务;此类工作可能无法完成 在方法完成之前。相反,您应该执行重负载 onStop() 期间的关闭操作

https://developer.android.com/guide/components/activities/activity-lifecycle#onpause

我错过了什么?

【问题讨论】:

  • 如果您使用 MVVM 进行开发,您的视图模型/模型层无论如何都不应该感知生命周期。最佳做法是尽快存储持久数据,以免在您的应用进程突然终止时丢失。
  • @Pawel 这种观点有点幼稚。首先,MVVM 并不总是最好的模式,只有少数应用程序使用它。其次,不断地将模型写入存储会导致大量写入,这可能会成为性能瓶颈。此外,不断写入闪存会加速存储设备的故障。如果您在每次更改视图模型时都编写它,那么您可能做错了。
  • @GabeSechan 在大多数情况下,“持久化数据”归结为仅将用户交互导致的(增量)更新写入数据库,因此理想情况下您希望它们尽快存储。除非查询真的很幼稚(例如每次写入数千条记录),否则这不会真正导致任何瓶颈或大量存储磨损。只有在一些更不常见的情况下(比如编辑文件),我会考虑在onPause 期间定期保存 w/额外的保存触发器。
  • @GabeSechan 在这一点上,我们只是在争论什么是“更新” - 如果任何 OP 正在寻找通用答案,如果没有至少一点关于他试图坚持的内容的背景信息就无法提供.我的观点是不要仅仅依赖生命周期方法(最好完全不依赖它们),因为如果应用程序崩溃或以其他方式中断,它会导致数据丢失。
  • @Pawel 我的观点是要依赖生命周期方法,不要照你说的做。在一般情况下,可能有特定的 tikmes 可以。实际上,数据丢失的唯一风险是在崩溃的情况下。如果您有适当的测试,应该很少发生它不应该关心您。

标签: android android-lifecycle


【解决方案1】:

所以文档有点过时了。例如,它说不要在 onPause 中进行网络连接——无论如何你都不能。网络需要在主线程以外的线程上,并且 onPause 总是在主线程上调用。您可以向另一个线程发送请求以进行联网,但这不是问题,无论您在哪里进行。

在 onPause 和 onStart 中执行此操作之间的权衡是在调用时。当 Activity 不再是前台时调用 onPause。当 Activity 完全离开屏幕时调用 onStop。所以在少数情况下会调用 onPause 而不会调用 onStop。这让我更喜欢 onPause。

真正的教训是 onPause 和 onStop 都应该很快。也不要做很多工作。如果您需要做一些不快的事情,请在另一个线程上做。当然,这几乎适用于主线程上的所有内容 - 如果速度不快,请在其他地方进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多