2015-01-05 18 views
5

Starałem się unikać tworzenia obiektów Realm i zarządzania nimi w mojej aplikacji na Androida dla każdego fragmentu. Myślę, że ThreadLocalVariable może być dobrym początkiem.Jak poprawnie używać 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(); 
    } 
} 

Chciałbym po prostu utworzyć statyczny końcowy przedmiotu RealmInstanceGenerator w moich utils Singleton klasy i wywołać setRealmForCurrentThread w moim główną działalność. Wtedy zadzwonię, usuń, gdy moja aktywność umrze. Dla każdego nowego wątku automatycznie generowany jest nowy obiekt Realm. Czy to dobra strategia?

+0

pisałem [ten przewodnik dla Realm 1.2.0] (https://medium.com/@Zhuinden/basics-of-realm-a-guide-to-using-realm-1-2-0-634471c0fe8f#.sltph3ynl) – EpicPandaForce

Odpowiedz

20

Christian z królestwa tutaj. To dobra strategia i na szczęście już to zaimplementowaliśmy :) Wszystkie instancje Realm są już buforowane w ThreadLocal i śledzimy instancje za pomocą licznika. Dziedzina jest całkowicie zamknięta, gdy licznik osiągnie 0.

To oznacza tak długo, jak zawsze wywołuje close() (co powinieneś), jest to faktycznie ta sama metoda co metoda remove().

można zobaczyć wzór zastosowany w tym przykładzie tutaj: https://github.com/realm/realm-java/tree/master/examples/threadExample/src/main/java/io/realm/examples/threads

a kod źródłowy dla klasy Realm jest tutaj: https://github.com/realm/realm-java/blob/master/realm/src/main/java/io/realm/Realm.java

+0

Realm backend jest oparty na LMDB? Czy to jest open source jak forntends? – Maniero