Android 为什么childEventListener不工作?

Android 为什么childEventListener不工作?,android,firebase,firebase-realtime-database,event-listener,Android,Firebase,Firebase Realtime Database,Event Listener,使用childEventListener的代码如下所示: DatabaseReference TUidRef=usersRef.child(td); Log.i(“你好”,td); TUidRef.addChildEventListener(新的ChildEventListener(){ @凌驾 公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){ ms=dataSnapshot.child(“rec_msg”).ge

使用
childEventListener
的代码如下所示:

DatabaseReference TUidRef=usersRef.child(td);
Log.i(“你好”,td);
TUidRef.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){
ms=dataSnapshot.child(“rec_msg”).getValue(String.class);
fUid=dataSnapshot.child(“fromUID”).getValue(String.class);
st=dataSnapshot.child(“rec_secret”).getValue(String.class);
整数公里=0;
试一试{
km=整数.parseInt(st);
}
捕获(数字格式){
Log.d(“NumberError:,“无法转换”);
}
如果(ms!=null&!ms.equals(“”)
addMessageBox(毫秒,公里);
其他的
Toast.makeText(Main5Activity.this,“出错了”,Toast.LENGTH_SHORT.show();
}
@凌驾
public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){
ms=dataSnapshot.child(“rec_msg”).getValue(String.class);
fUid=dataSnapshot.child(“fromUID”).getValue(String.class);
st=dataSnapshot.child(“rec_secret”).getValue(String.class);
整数公里=0;
试一试{
km=整数.parseInt(st);
}
捕获(数字格式){
Log.d(“NumberError:,“无法转换”);
}
如果(ms!=null&!ms.equals(“”)
addMessageBox(毫秒,公里);
其他的
Toast.makeText(Main5Activity.this,“出错了”,Toast.LENGTH_SHORT.show();
}
@凌驾
公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){
if(mAuth.getUid().equals(fUid))
Toast.makeText(Main5Activity.this,“您离开了对话”,Toast.LENGTH_SHORT.show();
其他的
Toast.makeText(Main5Activity.this,“用户离开了对话”,Toast.LENGTH_SHORT.show();
}
@凌驾
public void onChildMoved(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
usersRef
定义为:

DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
最终数据库引用usersRef=rootRef.child(“用户”);
奇怪的是,当我将
childEventListener
附加到
usersRef
时,它就起作用了,但从逻辑上讲,我只需要监听特定于变量
td
的更改

td
的值是需要监听的孩子的
uid

数据库如下所示:

在这种情况下,您应该使用一个
ValueEventListener
,它一次侦听一个节点。代码非常相似:

DatabaseReference TUidRef = usersRef.child(td);

TUidRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        ms = dataSnapshot.child("rec_msg").getValue(String.class);
        fUid = dataSnapshot.child("fromUID").getValue(String.class);
        st = dataSnapshot.child("rec_secret").getValue(String.class);

        int km = 0;
        try {
            km = Integer.parseInt(st);
        }
        catch (NumberFormatException e) {
            Log.d("NumberError:", "Can't convert");
        }

        if(ms!=null && !ms.equals(""))
            addMessageBox(ms,km);
        else
            Toast.makeText(Main5Activity.this,"Something went wrong",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException();
    }
});