2016-03-04 18 views
2

我一直在使用領域中的應用程序,我目前正在開發,並發現自己一次又一次地打字了這種模式:我可以將Realm.getDefaultInstance()。executeTransaction([transaction])作爲「單線程」嗎?

try (Realm realm = Realm.getDefaultInstance()) { 
    realm.executeTransaction(tRealm -> { 
     // Execute some transaction in here 
    }); 
} 

雖然它不是完全醜陋的,我喜歡的事實,在try-與資源關閉realm對我來說,我發現自己想知道這將足以簡化到這樣的事情:

Realm.getDefaultInstance().executeTransaction(tRealm -> { 
    // Execute some transaction in here 
} 

我寧願這不僅因爲它是嵌套少了一個級別,因爲那時我沒有得到一個Realm的實例,只是爲了調用executeTransaction(),然後給我一個不同的 Realm實例使用。

但是我還沒有切換到第二個片段,因爲我擔心它的Realm.getDefaultInstance()部分會導致我的問題(因爲我沒有爲它調用close())。我的思想是否正確,因此應該繼續使用第一個片段,或者我可以使用第二個片段嗎?

回答

2

第二個片段存在問題,因爲Realm保留一個引用計數緩存,用於確定底層資源何時應該完全關閉,因此使用它意味着您保持打開底層資源,這會導致OOM錯誤。刪除Realm或嘗試遷移它也有問題。

上面的圖案也是危險的,如果在後臺線程中完成的,你再保持一個境界在舊版本中打開這可能會導致你的文件大小增加,因爲境界跟蹤多個版本:https://realm.io/docs/java/latest/#large-realm-file-size

它如果在主線程上完成,在技術上是安全的,但由於您在後臺執行時不釋放資源,因此該應用程序被系統殺死的可能性要高得多。

+0

Ahh看到了,我認爲ref-counting會是一個問題,但我甚至沒有想到你列出的其他東西。那麼我肯定會堅持第一種模式,謝謝你的迅速和詳細的答案! –

相關問題