2016-02-15 21 views
7

非同期トランザクションを実行しているときはいつでも、レルムインスタンスを閉じる際の良い習慣を理解することに問題があります。レルム - 非同期トランザクションを使用したレルムインスタンスのクローズ方法

私のアプリケーションでは多くのコントローラがあり、Realmインスタンスをアクティビティから渡すのではなく、必要なときに新しいインスタンスを作成し、作業が終わるとすぐに閉じます。

最近、非同期トランザクションを実行しているときにrealmインスタンスを閉じると、正しく動作していないことがわかりました。

Realm cacheRealm = RealmDelegate.getCacheRealm(); 

cacheRealm.executeTransaction(realm -> { 
    doSomeWork(response); 
    realm.copyToRealmOrUpdate(response); 
}, callback); 
cacheRealm.close(); 

上記のコードには大きな問題があります。トランザクションが完了する前にレルムインスタンスを閉じるので、そのコールバックは起動されません。

したがって、私はこの状況にどのように対処するのか分かりません。私は、Realmオブジェクトのインスタンスをアクティビティやフラグメントから各コントローラに渡し、そこだけの領域インスタンスの終了を処理するはずですか?それとも、この問題の他のより洗練された解決策がありますか?

また、Realm dbを閉じないと、Realmのすべてのインスタンスが閉じられているかどうかを確認する方法があります。

答えて

4

代わりにコールバックでレルムを閉じることができますか?あなたはにフックするエラーと成功のコールバックの両方を持っている:https://realm.io/docs/java/latest/#asynchronous-transactions

realm.executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm bgRealm) { 
      User user = bgRealm.createObject(User.class); 
      user.setName("John"); 
      user.setEmail("[email protected]"); 
     } 
    }, new Realm.Transaction.OnSuccess() { 
     @Override 
     public void onSuccess() { 
      // Transaction was a success. 
     } 
    }, new Realm.Transaction.OnError() { 
     @Override 
     public void onError(Throwable error) { 
      // Transaction failed and was automatically canceled. 
     } 
    }); 
+0

私はので、私はあそこレルムインスタンスを作成する必要があり、他のクラスにコールバックを構築していますので、これは、小さな問題があります。しかし、私はそれがアクティビティまたはフラグメントで1つのインスタンスを持つよりも優れていると思います。 質問の第2の部分として、すべてのインスタンスが閉じられているかどうかを確認する方法はありますか? –

+0

いいえ、あなたは 'Realm.isClosed'を使うことができますが、それは現在のスレッドのインスタンスだけをチェックします。 –

+0

別のコールバックを作成し、作成したコールバック内の他のクラスから渡された元のコールバックを呼び出すことができます。 – zaki50

関連する問題