Я пытаюсь обернуть GeoQueryEventListener в LiveData, но не все местоположения отображаются в пользовательском интерфейсе, всегда отображаются одно или два местоположения, у меня есть база данных firebase, где store de location с идентификатором места, и у меня есть firestore коллекция, где я храню места, при выполнении GeoQuery с идентификатором местоположения я ищу место в пожарном депо. В моем журнале я вижу много сообщений "onKeyEntered" с идентификатором местоположения.
Мой класс хранилища:
public class GeoLocationsPlacesRepository {
private final static String TAG =
GeoLocationsPlacesRepository.class.getName();
private FirebaseDatabase database;
private PlacesRepository placesRepository;
public GeoLocationsPlacesRepository(PlacesRepository placesRepository) {
super();
database = FirebaseDatabase.getInstance();
this.placesRepository = placesRepository;
}
private Flowable<Resource<Place>> flowableList(@NonNull final GeoLocation geoLocation,
@NonNull final Double radius) {
return Observable.create(new
ObservableOnSubscribe<Resource<Place>>() {
@Override public void subscribe(ObservableEmitter<Resource<Place>> emitter) {
final GeoFire geoFire =
new GeoFire(database.getReference(DatabasesConstant.GEO_LOCATION_PLACES_DATABASE_PATH));
final GeoQuery geoQuery =
geoFire.queryAtLocation(new GeoLocation(geoLocation.latitude, geoLocation.longitude),
radius);
final GeoQueryEventListener geoQueryEventListener = new GeoQueryEventListener() {
LiveData<Resource<Place>> liveDataPlace;
Observer<Resource<Place>> observerPlace = emitter::onNext;
@Override public void onKeyEntered(String key, GeoLocation location) {
Log.i(TAG, "onKeyEntered = " + key);
liveDataPlace = placesRepository.findById(Long.valueOf(key));
liveDataPlace.observeForever(observerPlace);
}
@Override public void onKeyExited(String key) {
//empty
}
@Override public void onKeyMoved(String key, GeoLocation location) {
//empty
}
@Override public void onGeoQueryReady() {
if (liveDataPlace.hasObservers()) {
liveDataPlace.removeObserver(observerPlace);
geoQuery.removeGeoQueryEventListener(this);
}
}
@Override public void onGeoQueryError(DatabaseError error) {
emitter.onNext(Resource.error(error.getMessage(), null));
}
};
geoQuery.addGeoQueryEventListener(geoQueryEventListener);
}
}).toFlowable(BackpressureStrategy.BUFFER);
}
public LiveData<Resource<Place>> list(@NonNull final GeoLocation geoLocation,
@NonNull final Double radius) {
return LiveDataReactiveStreams.fromPublisher(flowableList(geoLocation, radius));
}
}
в моей ViewModel имеет:
public LiveData<Resource<Place>> loadPlaces(@NonNull final GeoLocation geoLocation,
@NonNull final Double radius) {
return geoLocationsPlacesRepository.list(geoLocation, radius);
}
в моей активности:
private void loadPlaces(GeoLocation geoLocation, Double radius) {
homeViewModel.loadPlaces(geoLocation, radius).observeForever(this::updateMapUi);
}