【问题标题】:Realm lifecycles in fragments片段中的领域生命周期
【发布时间】:2015-11-24 18:59:33
【问题描述】:

根据 Realm 文档,为了正确处理领域生命周期,必须在每个 onCreate(in Activities) 和 onStart(Frags) 中打开领域实例, 然后在每个activity(onDestroy()) 和frags(onStop()) 中关闭。

在我的片段中,数据处理是从 onCreate() 开始的,它发生在 onStart() 之前。

我决定在我的片段中的 onCreate() 中作弊并实例化 mRealm 实例。我的片段有一个带有 RecyclerView.Adapter 的 recyclerview(不是 RealmBaseAdapter,因为我不知道如何使它适用于 recyclerview)。现在问题来了:

java.lang.IllegalStateException: 这个 Realm 实例已经关闭,无法使用。

在调用适配器中的 getItemCount() 之后,从 Activity1 Fragment1 移动到 Activity2 Fragment2 时会发生这种情况。作为调试,我在调用 getItemCount() 之前使用 logcat 输出 mRealm.isClosed(),这证实了领域不为空且未关闭。但是我还是知道这个领域已经关闭了!

作为临时解决方案,我在 Fragment1 中禁用了 mRealm.close(),这似乎解决了解决方案,但这只是一个创可贴。

有什么想法吗?

【问题讨论】:

  • 您使用的是什么版本的 Realm?你能分享一些代码吗?

标签: java realm


【解决方案1】:

也可以将onCreate/onDestroy 用于片段。唯一的缺点是您的片段可能会被缓存,这意味着在应用程序实际被杀死之前不会调用onDestroy

请注意,如果您仅在片段中使用 Realm,则第一个片段关闭和第二个片段打开之间可能没有重叠。这意味着 Realm 将完全关闭并释放所有资源。

内部 Realm 缓存是引用计数的,所以如果您的所有活动在 onCreate 期间打开一个 Realm,并在 onDestroy 期间关闭它(即使您没有直接在 Activity 中使用它,那么您应该始终拥有一个实时 Realm UI 线程上的实例。

【讨论】:

  • 我和@RJFares 的情况完全一样。当我从 Activity1>Fragment1 移动到 Activity2 然后回到 Activity1>Fragment1 时,应用程序不断崩溃。但是我怎样才能实现“在 UI 线程上总是有一个实时的 Realm 实例”?
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多