2016-02-15 6 views
7

У меня возникла проблема с пониманием того, что является хорошей практикой при закрытии экземпляра Realm, когда я выполняю транзакцию async.Realm - как закрыть экземпляр realm с транзакцией async

В моем приложении у меня много контроллеров, и я не передаю им экземпляр Realm из активности, вместо этого я создаю новый каждый раз, когда это необходимо, и закрывайте его, как только работа будет выполнена.

Однако недавно я выяснил, что он работает некорректно, если я закрываю экземпляр Realm, когда он запускает транзакцию async.

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

Это небольшая проблема, так как я построения обратного вызова в другом классе, поэтому я должен был бы создать экземпляр Realm там. Но я думаю, что это лучше, чем один экземпляр в Activity или Fragment. Что касается второй части вопроса, есть ли способ проверить, закрыты ли все экземпляры? –

+0

Нет, вы можете использовать 'Realm.isClosed', но это будет проверять экземпляр только на текущий поток. –

+0

Вы можете создать еще один Обратный звонок и можете переадресовать исходный вызов обратно из других классов в созданном обратном вызове. – zaki50

Смежные вопросы