2017-02-27 31 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