目前我正面临一个问题,有时我需要用户只有在其他人可以在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..");
}
这可能吗?
答案 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);
}