【问题标题】:Realm life cycle - dealing with closed/invalid instances in android领域生命周期 - 处理 android 中的关闭/无效实例
【发布时间】:2017-07-29 03:59:15
【问题描述】:

领域 java 文档建议将领域实例与 Activity/Fragment's 生命周期相关联,以便在创建/销毁 Activity/Fragment 时打开/关闭领域。

假设Activity 上的用户交互触发了一堆链式异步/基于回调的代码,这些代码最终在与Activity 关联的领域实例上发出读/写。

如果用户在交互后立即退出活动并且领域实例作为Activity's onDestroy 的一部分关闭,那么什么是确保关闭实例上的事务/查询静默失败的好方法,因为它是一个嵌套的回调链。

在调用任何方法之前检查领域实例是否已关闭/有效是乏味的。

同时,打开一个领域实例并关闭它只是为了写/读一些东西可能会很昂贵。

什么是避免此类崩溃的好方法?

【问题讨论】:

  • a bunch of chained asynchronous/callback-based code 应该由后台服务处理,该服务可以获得自己的 Realm 实例引用。 that eventually issue reads/writes on the realm instance associated with the activity 在活动中注册的领域观察者将对领域中的数据变化做出反应。如果活动处于活动状态,则更改将显示在 UI 中。如果它死了,没人在乎。
  • 并非每个领域访问都可以委托给后台服务。
  • 你将不得不解释你为什么这么认为。为什么它在你的情况下不起作用?您将从所有线程访问相同的底层数据。
  • 我和@EugenPechanec 在一起。你提到“崩溃”。崩溃?如果您可以显示堆栈跟踪,我们可以提供更多帮助。在您的应用程序过程中打开和关闭在其他地方打开的领域非常非常便宜,FWIW。如果你真的需要防止回调被破坏的组件(活动等),请使用SoftReferences(绝对不是我通常推荐的)
  • Checking if a realm instance is closed/valid before calling any method on it is tedious. 你也不必这样做。在每次操作之前调用Realm.getInstance() 并在你完成之后关闭它。领域实例是引用计数的。只要一个句柄保持打开状态,打开更多句柄(从同一个线程)几乎是免费的。

标签: java android realm


【解决方案1】:

我相信这里的基本问题是:“如何防止对死组件的回调?”。答案在 Realm 文档中,here:您必须在组件退出时取消注册侦听器(onPauseonStoponDestroy)。

如果我理解正确的话,Realm 是否开放的问题是一个红鲱鱼。侦听器必须未注册。

【讨论】:

  • 就个人而言,我更喜欢在onDestroy 中注销,但很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多