Правильный способ использовать GeoFire с LiveData и ViewModel в Android? - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь обернуть 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);
  }
...