2016-08-05 34 views
3

Ich bin derzeit Realm in meiner Anwendung verwenden, und um sicherzustellen, dass i Realm Instanzen korrekt verwalten, eingeführt ich in meinem Basisaktivität eine Variable wie folgt aus:Kotlin faul Nutzung

protected val realm: Realm by lazy { 
     Realm.getDefaultInstance() 
} 

Und dann in onDestroy ich tun dies:

override fun onDestroy() { 
    super.onDestroy() 
    realm.close() 
} 

Und dann erkannte ich, dass dies eine Verschwendung ist. Wenn die aktuelle Aktivität kein Realm verwendet, wird sie in onDestroy geöffnet und sofort geschlossen.

private var usedRealm = false 

    protected val realm: Realm by lazy { 
     usedRealm = true 
     Realm.getDefaultInstance() 
    } 

override fun onDestroy() { 
     super.onDestroy() 

     if (usedRealm) { 
      realm.close() 
     } 
    } 

Gibt es eine Möglichkeit, das gleiche zu erreichen, ohne die zusätzliche Flagge:

Also ich diese aktualisiert?

Antwort

10
  1. Ihre aktuelle Implementierung enthält einen Fehler. Wenn Realm.getDefaultInstance() löst, wird usedRealm auf true gesetzt, aber der Lazy wird nicht initialisiert (Initialisierung wäre fehlgeschlagen). Sie können dieses Problem beheben, indem nur usedRealm = truenach Aufruf Realm.getDefaultInstance() Aufruf:

    protected val realm: Realm by lazy { 
        val realm = Realm.getDefaultInstance() 
        usedRealm = true 
        realm 
    } 
    

    oder

    protected val realm: Realm by lazy { 
        Realm.getDefaultInstance().apply { usedRealm = true } 
    } 
    
  2. Sie das gleiche ohne die zusätzliche Flagge, indem sie einen Verweis auf das rohe Lazy Ziel erreichen kann selbst:

    private val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    protected val realm by lazyRealm 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        if (lazyRealm.isInitialized()) { 
         realm.close() 
        } 
    } 
    

    Dies erfordert noch ein Addit Sie müssen den Initialisierungszustand nicht mehr selbst pflegen.

  3. Sie können auch Lazy direkt anstelle von as a delegate:

    protected val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        if (lazyRealm.isInitialized()) { 
         lazyRealm.value.close() 
        } 
    } 
    

    oder

    protected val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        with(lazyRealm) { 
         if (isInitialized()) { 
          value.close() 
         } 
        } 
    } 
    

    Das macht es so, dass es keine zusätzliche Eigenschaft ist aber Lazy ist jetzt Teil Ihrer API und überall wo Sie einfach realm referenziert hätten, müssen Sie nun auf lazyRealm.value verweisen. Sie können die Vor- und Nachteile abwägen. :-)

+3

schöner Fang! Vielen Dank –