Mapsforge не перерисовывает кластерные POI из Realm

Я использую Realm для загрузки POI из БД. Затем добавьте эти пункты к реализации кластера с помощью mapsforge. Этот код хорошо работает:

 RealmResults<GasolineRealm> gasolineRealms = presenter.getRealm().where(GasolineRealm.class)
            .findAll();
    for(int i=0; i<gasolineRealms.size(); i++){
        geoItems.add(new GasolineGeoItem(gasolineRealms.get(i).getId(),
                gasolineRealms.get(i).getLocalizationRealms().get(0).getTitle(),
                gasolineRealms.get(i).getCoordinateLatitude(),
                gasolineRealms.get(i).getCoordinateLongitude()));
        clusterer.addItem(geoItems.get(i));
    }

Он рисует все POI на карте, но если я использую RxJava для кластера Realm, никогда не добавляйте POI на карту. Вот код:

Realm.getDefaultInstance().where(GasolineRealm.class)
            .findAllAsync()
            .asObservable()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<RealmResults<GasolineRealm>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(RealmResults<GasolineRealm> gasolineRealms) {
                    for(int i=0; i<gasolineRealms.size(); i++){
                        geoItems.add(new GasolineGeoItem(gasolineRealms.get(i).getId(),
                                gasolineRealms.get(i).getLocalizationRealms().get(0).getTitle(),
                                gasolineRealms.get(i).getCoordinateLatitude(),
                                gasolineRealms.get(i).getCoordinateLongitude()));
                        clusterer.addItem(geoItems.get(i));
                    }
                }
            });

2 ответа

Решение

Эти два были бы почти эквивалентны, если бы вы сделали это

     Subscription subscription = presenter.getRealm().where(GasolineRealm.class)
        .findAllAsync()
        .asObservable()
        .filter(RealmResults::isLoaded)
        .first()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<RealmResults<GasolineRealm>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(RealmResults<GasolineRealm> gasolineRealms) {
                for(int i=0; i<gasolineRealms.size(); i++){
                    GasolineRealm gasolineRealm = gasolineRealms.get(i);
                    geoItems.add(new GasolineGeoItem(gasolineRealm.getId(),
                            gasolineRealm.getLocalizationRealms().get(0).getTitle(),
                            gasolineRealm.getCoordinateLatitude(),
                            gasolineRealm.getCoordinateLongitude()));
                    clusterer.addItem(geoItems.get(i));
                }
            }
        });

Оба примера в моем проекте хорошо работают со стандартными представлениями...

Советую попробовать реализовать следующим образом:

Subscription s = Observable.create(new Observable.OnSubscribe<List<GasolineRealm>>() {
        @Override
        public void call(Subscriber<? super List<GasolineRealm>> subscriber) {
            Realm realm = presenter.getRealm();
            RealmResults<GasolineRealm> gasolineRealms = realm.where(GasolineRealm.class).findAll();
            subscriber.onNext(realm.copyFromRealm(gasolineRealms));
            realm.close();
            subscriber.onCompleted();
        }
    }).subscribe(new Subscriber<List<GasolineRealm>>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "GasolineRealm Subscriber is completed");
        }

        @Override
        public void onError(Throwable throwable) {
            Log.e(TAG, "GasolineRealm Subscriber onError " + throwable.getMessage());
        }

        @Override
        public void onNext(List<GasolineRealm> gasolineRealms) {
            for (int i = 0; i < gasolineRealms.size(); i++) {
                geoItems.add(new GasolineGeoItem(gasolineRealms.get(i).getId(),
                        gasolineRealms.get(i).getLocalizationRealms().get(0).getTitle(),
                        gasolineRealms.get(i).getCoordinateLatitude(),
                        gasolineRealms.get(i).getCoordinateLongitude()));
                clusterer.addItem(geoItems.get(i));
            }
        }
    });
Другие вопросы по тегам