禁用firebase中的脱机数据传输

时间:2018-03-16 14:02:25

标签: android firebase firebase-realtime-database

目前我正面临一个问题,有时我需要用户只有在其他人可以在firebase中收到消息时才能发送消息。默认情况下,我看到firebase仅对要传输的数据进行排队。例如,我有一个代码如下:

 Map<Object, Object> map = new HashMap<Object, Object>();
 map.put("message", messageText);
 databaseReference.push().setValue(map); 

即使用户处于离线状态,列表管理员也始终会监听正在推送的任何内容,并且原始用户会看到该消息已被发送。但是,它实际上造成了一个问题。即使消息将在以后发送,用户也已经看到该消息并确保已发送消息。

所以,我想要像

这样的东西
 if(connection.ActuallySent())
{
     Map<Object, Object> map = new HashMap<Object, Object>();
     map.put("message", messageText);
     databaseReference.push().setValue(map); 
}else
{
toast("Please try again..");
}

这可能吗?

1 个答案:

答案 0 :(得分:0)

处理此问题的常用方法是向用户显示该消息尚未传递到Firebase服务器。要知道何时发生这种情况,请将完成监听器附加到setValue电话。

databaseReference.push().setValue(map, new Firebase.CompletionListener() {
    @Override
    public void onComplete(FirebaseError firebaseError, Firebase firebase) {
        if (firebaseError != null) {
            System.out.println("Data could not be saved. " + firebaseError.getMessage());
        } else {
            System.out.println("Data saved successfully.");
        }
    }
});

如果您只想在用户连接到Firebase时进行编写,则可以attach a listener to .info/connected并且只有setValue时才调用true

bool connected = false;

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    connected = snapshot.getValue(Boolean.class);
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});

然后:

if (connected) {
     Map<Object, Object> map = new HashMap<Object, Object>();
     map.put("message", messageText);
     databaseReference.push().setValue(map); 
}
相关问题