【问题标题】:Realm in FirebaseMessagingServiceFirebaseMessagingService 中的领域
【发布时间】:2017-05-11 20:27:38
【问题描述】:

我在我的 firebase 服务中使用领域,我正在关闭我的 finally 块中的领域实例,但是当我在我的 try 块中执行异步操作时出现问题,在这种情况下,finally 在异步完成和领域之前执行实例已关闭,这会导致应用程序崩溃,因为异步操作执行领域相关的任务。

try {
 // perform async task that requires realm
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (realm != null && !realm.isClosed())
        realm.close();
}

这就是代码的大致样子。如果我尝试在其他任何地方关闭领域实例,我会收到一条错误消息,说我正在从不正确的线程访问领域实例,有没有办法可以等到异步操作完成完成,然后才关闭领域实例。

【问题讨论】:

  • 你能在你的异步任务上打开和关闭一个 Realm 实例吗?或者你可以使用异步 Realm 事务吗? Realm 在设计上是线程受限的:realm.io/docs/java/latest/#using-a-realm-across-threads
  • 这在很大程度上取决于你正在做什么样的异步工作。请提供更多详细信息。
  • @ChristianMelchior 我正在使用 fcm 收到一个通知,其中包含我需要加载的图像 url,所以我将此通知存储在领域中并生成相同的通知,但考虑加载图像是异步的任务,由于其余代码是同步的,当控件返回领域实例时已经关闭,我现在使用的解决方法是从领域复制对象并将其用于处理,即使领域关闭也是如此,它不会崩溃。

标签: java android asynchronous try-catch realm


【解决方案1】:

所以,你真的不能在 try/catch 块中执行异步任务。

...“不能”并不是说这是不好的做法,我的意思是根据“异步”的定义,这是不可能的。

您在 try/catch 块中所做的是排队任务,以便稍后执行。一旦任务入队(未执行!),try/catch 块将退出。

如果你想在异步执行的代码周围有 try/catch 块,你需要在异步任务的一部分执行它。

此外,正如您将在documentation 中看到的,您不能在线程之间传递大多数 Realm 对象。您不能在某个线程上打开领域,然后将其传递给异步任务。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2011-12-23
    相关资源
    最近更新 更多