2015-01-05 52 views
5

我試圖避免創建和管理Realm對象,在我的Android應用程序中,爲每個片段。我認爲ThreadLocalVariable可能是一個好的開始。如何正確使用Realm

public class RealmInstanceGenerator extends ThreadLocal<Realm> { 

    public Realm getRealmForMyThread(Context context) { 

     if(get() == null && context != null) 
      super.set(Realm.getInstance(context)); 

     return get(); 
    } 

    public void setRealmForCurrentThread(Context context) { 

     if(context != null) 
      super.set(Realm.getInstance(context)); 
    } 

    @Override 
    protected Realm initialValue() { 
     return null; 
    } 

    @Override 
    public void remove() { 
     if(get() != null) get().close(); 
     super.remove(); 
    } 
} 

,我只想在我的utils的單例類創建RealmInstanceGenerator的靜態最終目標,並呼籲setRealmForCurrentThread在我的MainActivity。然後我會在我的活動消失時致電刪除。對於任何新的線程,將自動生成一個新的Realm對象。 這是一個好策略嗎?

+0

我寫了[本指南境界1.2.0(HTTPS:/ /medium.com/@Zhuinden/basics-of-realm-a-guide-to-using-realm-1-2-0-634471c0fe8f#.sltph3ynl) – EpicPandaForce

回答

20

Christian來自Realm這裏。 這是一個很好的策略,幸運的是我們已經爲你實現了它:)所有的Realm實例已經被緩存在ThreadLocal中,並且我們使用計數器跟蹤實例。一旦計數器達到0,領域就完全關閉。

這意味着只要您總是調用close()(您應該),它實際上與您的remove()方法相同。

你可以看到在這個例子在這裏使用的模式:https://github.com/realm/realm-java/tree/master/examples/threadExample/src/main/java/io/realm/examples/threads

而對於領域類的源代碼是在這裏:https://github.com/realm/realm-java/blob/master/realm/src/main/java/io/realm/Realm.java

+0

Realm後端基於LMDB?它是否像forntends一樣開源? – Maniero