2017-02-27 30 views
0

处理领域的交易在几件样品代码在那里,我见过像这样的模式:如何在Android

try (Realm realm = Realm.getDefaultInstance()) { 
    realm.beginTransaction(); 
    workWithRealmData(); 
    realm.commitTransaction(); 
} 

的问题是 - 这是安全的吗?如果“workWithRealmData()”函数引发异常,则该事务不会被取消。但是,我们终于在试用资源的时候关闭了领域。

一个更安全的建筑看起来像下面这样:

try (Realm realm = Realm.getDefaultInstance()) { 
    realm.beginTransaction(); 
    try { 
    workWithRealmData(); 
    realm.commitTransaction(); 
    } finally { 
    if (realm.isInTransaction()) { 
     realm.cancelTransaction(); 
    } 
    } 
} 

这看起来更安全 - 但看起来也显著厉害,为所有callsites编码。

所以这真的可以归结为 - 如果Realm在之后立即关闭,是否可以忽略cancelTransaction?如果不是,会出现什么问题?

+0

如果你关闭领域,那么忽略'cancelTransaction'是安全的。但它对我来说确实感觉有点不安全,因为如果你错过了一个地方,那么你会阻止一个线程。 –

+0

太好了 - 谢谢你的确认,基督徒! – tmtrademark

回答

1

您可以使用executeTransaction(Realm.Transaction)方法,该方法在发生错误时自动取消同步事务。

try(Realm r = Realm.getDefaultInstance()) { 
    r.executeTransaction((realm) -> { 
     workWithRealmData(); 
    }); 
} 
+0

这是一个很好的建议 - 谢谢!不过,我仍然对原始代码示例的行为很好奇。据我了解,你建议的样本涉及创建一个新的匿名类 - 在我们的单元测试框架中使用起来有些痛苦,因为Realm不会被嘲笑(最后我看了)。 – tmtrademark

+0

我们在2.2.2中使所有的Realm类都不是最终的,所以你应该能够使用Mockito来模拟所有的类。 –

+0

如果你检查'executeTransaction'的源代码,它几乎可以显示你在顶部显示的内容。 – EpicPandaForce