У меня возникла проблема с пониманием того, что является хорошей практикой при закрытии экземпляра 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?
Это небольшая проблема, так как я построения обратного вызова в другом классе, поэтому я должен был бы создать экземпляр Realm там. Но я думаю, что это лучше, чем один экземпляр в Activity или Fragment. Что касается второй части вопроса, есть ли способ проверить, закрыты ли все экземпляры? –
Нет, вы можете использовать 'Realm.isClosed', но это будет проверять экземпляр только на текущий поток. –
Вы можете создать еще один Обратный звонок и можете переадресовать исходный вызов обратно из других классов в созданном обратном вызове. – zaki50