Android 移除并重新插入GeoFire位置,以触发onKeyExited和onKeyEntered不';行不通

Android 移除并重新插入GeoFire位置,以触发onKeyExited和onKeyEntered不';行不通,android,firebase,firebase-realtime-database,geofire,Android,Firebase,Firebase Realtime Database,Geofire,我对GeoFire和Firebase有问题 我想根据GeoFire位置触发器更新UI上的信息。当客户端发生操作时,必须将数据保存在Firebase数据库上,并且必须更新GeoFire 我会用一些代码更清楚 1-客户端的操作。为用户及其位置存储温度 public void sendTemperature(Float temp) { LatLng myPosition = getMyPosition(); //instantiate the db connection F

我对GeoFire和Firebase有问题

我想根据GeoFire位置触发器更新UI上的信息。当客户端发生操作时,必须将数据保存在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-问题。我期望发生的是,当一个新的温度被发送时,监听器检测到它的删除和新的插入(但实际上它的键没有改变),所以我可以更新我的UI。这不会发生,因为这两个动作非常快,GeoFire侦听器不会触发任何东西,因此数据库中没有任何更改


有没有办法让侦听器按我所希望的方式运行?

这可能可以通过使用所谓的in to
removeLocation()
来解决

未经测试的快速撰写(因此可能包含语法错误):

使用这种方法,在设置新位置之前,您需要等待数据库确认它已删除旧位置

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

}