【发布时间】: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