#android #realm #realm-mobile-platform
#Android #область #область-мобильная платформа
Вопрос:
Как правильно закрыть область с помощью асинхронного запроса, например
RealmResults<RealmUser> realmResults = realm
.where(RealmUser.class)
.in("id", ids)
.findAllAsync();
realmResults.addChangeListener(new RealmChangeListener<RealmResults<RealmUser>>() {
@Override
public void onChange(@NonNull RealmResults<RealmUser> realmUsers) {
if (realmUsers.size() > 0) {
List<RealmUser> users = realm.copyFromRealm(realmUsers);
callback.onSuccess(users);
realmResults.removeAllChangeListeners();
}
}
});
Если я оберну это внутри try/finally
блока, код не сработает, если я закрою область внутри onChange
, onChange
возможно, она никогда не будет вызвана.
примечание: я использую синхронизированную область с платформой realm.
Комментарии:
1. Я не понимаю, что вы пытаетесь сделать. Вы не только не сохраняете ссылку на RealmResults, что означает, что она может быть использована GC, вы также отображаете все элементы в потоке пользовательского интерфейса. Я не понимаю?
2. я пытаюсь инкапсулировать область в классе репозитория, вызвать репозиторий> получить данные> закрыть область
3. В этом случае вам нужно было бы сделать то же самое, что я сделал в github.com/Zhuinden/realm-monarchy (в частности, здесь ). Но имейте в виду, что я не смог интегрировать позиционный источник данных подкачки для работы с асинхронными запросами (которые необходимы для создания подписок на область синхронизации). Но обычный
findAllAsync()
сработал бы.4. Хорошо, спасибо, но в принципе я вижу, что RealmResults PermmisionManagers Realms должны быть привязаны к жизненному циклу представления, в вашем случае он привязан к livedata, который и закрывает ресурсы при вызове onInactive()
5. Вы можете создать LiveData в onCreate, observeForever в onCreate и removeObserver в onDestroy.