删除并重新插入 GeoFire 位置以触发 onKeyExited 和 onKeyEntered 不起作用
Remove and re-insert a GeoFire location to trigger onKeyExited and onKeyEntered doesn't work
我在使用 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 侦听器不会触发任何东西,因为它在数据库中没有任何变化。
有没有办法让听众按照我的意愿行事?
这可能可以通过在 removeLocation()
中使用所谓的 completion listener 来解决。
快速、未经测试的文章(因此可能包含语法错误):
geoUsersTemperatures.removeLocation(userId, new GeoFire.CompletionListener {
public void onComplete(String key, DatabaseError error) {
geoUsersTemperatures.setLocation(userId, new GeoLocation(myPosition.latitude, myPosition.longitude));
});
});
使用这种方法,您要等到数据库确认它已删除旧位置,然后再设置新位置。
我在使用 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 侦听器不会触发任何东西,因为它在数据库中没有任何变化。
有没有办法让听众按照我的意愿行事?
这可能可以通过在 removeLocation()
中使用所谓的 completion listener 来解决。
快速、未经测试的文章(因此可能包含语法错误):
geoUsersTemperatures.removeLocation(userId, new GeoFire.CompletionListener {
public void onComplete(String key, DatabaseError error) {
geoUsersTemperatures.setLocation(userId, new GeoLocation(myPosition.latitude, myPosition.longitude));
});
});
使用这种方法,您要等到数据库确认它已删除旧位置,然后再设置新位置。