2016-09-16 44 views
1

我遇到GeoFire等Firebase问题。删除并重新插入GeoFire位置以触发onKeyExited和onKeyEntered不起作用

我想根据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侦听器不会触发任何事情,因为它没有任何更改数据库。

有没有办法让侦听器按照我的意愿行事?

回答

0

这大概可以通过在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)); 
    }); 
}); 

用这种方法你等待,直到该数据库确认已设置新的位置之前删除旧的位置。