7 java android firebase firebase-realtime-database firebaseui
我正在关注Android Firebase Codelab.
这是我试图修改的友好聊天应用程序的项目:https://github.com/firebase/friendlychat-android/tree/master/android
我希望只有在从数据库中检索消息后才能填充MessageViewHolder .不幸的是,现在,MessageViewHolder也会在本地填充(在用户按下'SEND'之后).我不希望后者发生.这意味着视图持有者会更新两次(一次在本地,一次从数据库中检索),这是低效的.
侧节点:此外,当用户按下'SEND'并看到他的MessageViewHolder填充了他的消息时,用户可能会认为他在线.这是不需要的!
请转到MainActivity的第177行查看populateViewHolder方法.
在过去的几个月里,我一直试图回避这个问题,但现在我真的需要解决这个问题才能继续工作.为实现我想要的目标,我必须做出哪些改变?
使用事务发送消息,而不是setValue。这样你就可以确定你正在在线拨打电话,并且如果(没有检查这一点,但应该是)侦听器是 ValueEventListener,那么如果离线,则不会调用此侦听器。
如果添加了数据,您将看到这一点,否则不会(如果未在本地添加)创建事务时,您可以在 onComplete 中检查消息是否也已发送
只需使用databaseReference.runTransaction(transactionHandler, false)
为了确保事务仅在数据库连接时运行,您可以检查之前是否连接了 firebasedatabaseReference.runTransaction
override fun doTransaction(p0: MutableData?): Transaction.Result {
p0?.value = objectToPut
return Transaction.success(p0)
}
Run Code Online (Sandbox Code Playgroud)
有关交易的更多信息:https ://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions
如何检查是否在线:
DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
System.out.println("connected");
} else {
System.out.println("not connected");
}
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
997 次 |
| 最近记录: |