我正在使用Firebase数据库在android聊天应用程序上工作,我不知道代码出了什么问题,因为user1第一次发送消息时,它对于user1和当user2第一次发送消息时,也会发生同样的情况。 我指的是这样的:
和
。
这是从firebase数据库获取消息的代码。
usersRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ms = dataSnapshot.child("rec_msg").getValue(String.class);
fUid = dataSnapshot.child("fromUID").getValue(String.class);
if(ms!=null && !ms.equals(""))
addMessageBox(ms);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ms = dataSnapshot.child("rec_msg").getValue(String.class);
fUid = dataSnapshot.child("fromUID").getValue(String.class);
if(ms!=null && !ms.equals(""))
addMessageBox(ms);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
“ addMessageBox(String msg)”的代码如下:
private void addMessageBox(String message){
TextView tv = new TextView(Main5Activity.this);
tv.setText(message);
tv.setPadding(20, 30, 30, 20);
tv.setTextSize(1, (float) 20.1);
LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp2.weight = 1.0f;
if (mAuth.getCurrentUser().getUid().equals(fUid)) {
lp2.gravity = Gravity.END;
tv.setBackgroundResource(R.drawable.rounded_rectangle_grey);
}
else if(mAuth.getCurrentUser().getUid().equals(toUid)){
lp2.gravity = Gravity.START;
tv.setBackgroundResource(R.drawable.rounded_rectangle_violet);
}
tv.setLayoutParams(lp2);
layout.addView(tv);
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
final DatabaseReference usersRef = rootRef.child("users");
答案 0 :(得分:0)
这是因为要在OnChildChanged和OnChildAdded上添加一条消息。第一次发送消息时,两种方法都被调用,导致同一条消息被添加两次。尝试仅在OnChildAdded方法中保持逻辑。
usersRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ms = dataSnapshot.child("rec_msg").getValue(String.class);
fUid = dataSnapshot.child("fromUID").getValue(String.class);
if(ms!=null && !ms.equals(""))
addMessageBox(ms);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});