Realm Android: асинхронная транзакция влияет на поток пользовательского интерфейса

В настоящее время я использую область для запроса объектов RealmObjects, чтобы показать их в GoogleMap. Я выполняю чтение и получаю RealmResults, но я не могу найти способ поместить маркеры на карту из потока пользовательского интерфейса. Я бы предпочел сделать это с асинхронным вызовом, потому что это вызывает ~150 мс задержки в потоке пользовательского интерфейса.

public void loadLocations(final GoogleMap googleMap) {
        try {

        realm.executeTransactionAsync(new Realm.Transaction() {

            @Override
            public void execute(Realm realm) {
                RealmResults<LocationObject> locations = realm.where(LocationObject.class).findAll();
                for (LocationObject location: locations ) {
                        googleMap.addMarker(new MarkerOptions()
                                .position(new LatLng(location.lat, location.long))
                }
            }
        });
}

Как я могу позже получить доступ к RealmResults в потоке пользовательского интерфейса? Realm упоминает, что RealmObjects ограничены потоками

1 ответ

Решение

Вы можете попробовать использовать RealmChangeListener, Документы Realm иллюстрируют это очень ясно на примере щенков.

RealmResults<LocationObject> locations;

//...
    locations = realm.where(LocationObject.class).findAllAsync();

    locations.addChangeListener(new RealmChangeListener<Person>() {
        @Override
        public void onChange(RealmResults<LocationObject> locations) {
            googleMap.clear();
            for (LocationObject location: locations) {
                googleMap.addMarker(new MarkerOptions()
                            .position(new LatLng(location.lat, location.long));
            }
        }
    }

Приведенный выше код в основном делает запрос асинхронно с базой данных Realm и addChangeListener регистрирует метод обратного вызова, который будет вызван, когда запрос будет выполнен, и будет также вызываться в будущих вызовах запроса (дополнительную информацию см. в документации области).

Итак, я бы предложил запустить приведенный выше код в onStart или же onResume метод и не забудьте удалить прослушиватель изменений на onStop или же onPause метод, вот так:

locations.removeChangeListeners();

Наконец, не забудьте закрыть царство. Надеюсь, поможет! Не стесняйтесь спрашивать, если что-то неясно.

Другие вопросы по тегам