Удалите и повторно вставьте местоположение GeoFire для запуска onKeyExited, а onKeyEntered не работает

У меня проблема с GeoFire и так далее, Firebase.

Я хочу обновить информацию в пользовательском интерфейсе на основе триггера местоположения GeoFire. Когда действие происходит на стороне клиента, данные должны быть сохранены в базе данных Firebase, а GeoFire необходимо обновить.

Я буду более ясным с некоторым кодом.

1- Действие на стороне клиента. Храните температуру для пользователя и его местоположения.

public void sendTemperature(Float temp) {

    LatLng myPosition = getMyPosition();

    //instantiate the db connection
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference dbTemperatures = database.getReference("temperatures");

    //push the value to global temperature db
    String tempId = dbTemperatures.push().getKey();
    dbTemperatures.child("/"+tempId).setValue(temp);

    //create an index to link the user with its last sent temperature
    DatabaseReference dbUserLastTemperature = database.getReference("users_last_temperature");
    dbUserLastTemperature.child(userId).setValue(tempId);

    //update the geofireDb (here is the problem)
    geoUsersTemperatures.removeLocation(userId);
    geoUsersTemperatures.setLocation(userId, new GeoLocation(myPosition.latitude, myPosition.longitude));

}

2 - Слушатели на стороне клиента. Получайте уведомления о температуре пользователей поблизости.

    GeoQuery usersTemperatureGeoQuery = geoUsersTemperatures.queryAtLocation(new GeoLocation(getMyPosition().latitude, getMyPosition().longitude), mapsRadius);
    usersTemperatureGeoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            System.out.println(String.format("Key %s entered the search area at [%f,%f]", key, location.latitude, location.longitude));
            addTemperature(key, location);
        }

        @Override
        public void onKeyExited(String key) {
            System.out.println(String.format("Key %s is no longer in the search area", key));
            removeTemperature(key);
        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {
            System.out.println(String.format("Key %s moved within the search area to [%f,%f]", key, location.latitude, location.longitude));
            moveTemperature(key, location);
        }

        @Override
        public void onGeoQueryReady() {
            System.out.println("All initial data has been loaded and events have been fired!");
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {
            System.err.println("There was an error with this query: " + error);
        }
    });

3- Проблема. Я ожидал, что при отправке новой температуры слушатель обнаружит ее удаление и новую вставку (но на самом деле ее ключ не меняется), и поэтому я могу обновить свой пользовательский интерфейс. Этого не происходит, так как два действия выполняются настолько быстро, что прослушиватель GeoFire ничего не запускает, так как для него в БД ничего не меняется.

Есть ли способ заставить слушателя вести себя так, как мне хотелось бы?


person Jackie degli Innocenti    schedule 16.09.2016    source источник


Ответы (1)


Вероятно, это можно решить с помощью так называемого прослушиватель завершения в removeLocation().

Быстрая, непроверенная запись (поэтому она может содержать синтаксические ошибки):

geoUsersTemperatures.removeLocation(userId, new GeoFire.CompletionListener {
  public void onComplete(String key, DatabaseError error) {
    geoUsersTemperatures.setLocation(userId, new GeoLocation(myPosition.latitude, myPosition.longitude));
  });
});

При таком подходе вы ждете, пока база данных подтвердит, что она удалила старое местоположение, прежде чем устанавливать новое местоположение.

person Frank van Puffelen    schedule 16.09.2016