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));
}
}
});