Закрытие области и асинхронные запросы

#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.