2016-08-05 22 views
3

私は現在、私のアプリケーションでのレルムを使用しています、と私は正しくレルムインスタンスを管理を確認するために、私は私のベースの活動では、このような変数を導入:Kotlin怠惰な使い方

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

をそしてonDestroyで私がやりますこの:

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

そして、私はこれが無駄だと分かりました。現在のアクティビティがレルムを使用していない場合、それは開き、すぐにonDestroyで終了します。

だから私はこれに更新:

private var usedRealm = false 

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

override fun onDestroy() { 
     super.onDestroy() 

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

は、同じことを達成するためにどのような方法は、余分なフラグなし、ありますか?

答えて

10
  1. 現在の実装にはバグがあります。 Realm.getDefaultInstance()がスローする場合、usedRealmtrueに設定されますが、遅延は実際には初期化されません(初期化は失敗します)。あなただけRealm.getDefaultInstance()を呼び出し後usedRealm = trueを呼び出すことによってこの問題を解決することができます

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

    または

    protected val realm: Realm by lazy { 
        Realm.getDefaultInstance().apply { usedRealm = true } 
    } 
    
  2. あなたは生Lazyオブジェクト自体への参照を保持することにより、余分なフラグなしで同じことを実行できます。

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

    これにはまだaddit初期設定状態を自分で維持する必要はありません。

  3. またLazy代わりに、直接のas a delegateを使用することができます。

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

    または

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

    これは、それを作るそこに余分なプロパティではありませんが、Lazyは今どこでもあなたのAPIの一部となるように、 realmを単に参照した場合は、lazyRealm.valueを参照する必要があります。あなたは長所と短所を比較することになる。 :-)

+3

nice catch!ありがとう –

関連する問題