为什么childEventListener不起作用? [英] Why is the childEventListener not working?

查看:107
本文介绍了为什么childEventListener不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 childEventListener 的代码如下:

  DatabaseReference TUidRef = usersRef.child(td); 
Log.i( hello,td);

TUidRef.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);
st = dataSnapshot.child( rec_secret) .getValue(String.class);

int km = 0;
try {
km = Integer.parseInt(st);
}
catch (NumberFormatException e){
Log.d( NumberError:,无法转换);
}

if(ms!= null& ;! ms.equals())
addMessageBox(ms,km);
其他
Toast.makeText(Main5Activity.this,出了点问题,Toast.LENGTH_SHORT).show() ;
}

@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);
st = dataSnapshot.child( rec_secret)。getValue(String.class);

int km = 0;
try {
km = Integer.parseInt(st);
}
catch(NumberFormatException e){
Log.d( NumberError:,无法转换);
}


if(ms!= null&!amp; ms.equals())
addMessageBox(ms,km);
else
Toast.makeText(Main5Activity.this,出了点问题,Toast.LENGTH_SHORT).show();

}

@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot){
if(mAuth.getUid()。equals(fUid))
Toast.makeText(Main5Activity.this,您离开了对话,Toast.LENGTH_SHORT).show();
else
Toast.makeText(Main5Activity.this,用户离开了对话,Toast.LENGTH_SHORT).show();

}

@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot,@Nullable String s){

}

@Override
public void onCancelled(@NonNull DatabaseError databaseError){

}
});

usersRef 的定义为:

  DatabaseReference rootRef = FirebaseDatabase.getInstance()。getReference(); 
final DatabaseReference usersRef = rootRef.child( users);

奇怪的是,当我附加 childEventListener时,它可以工作code>到 usersRef ,但是从逻辑上讲,我只需要侦听特定于变量 td 的更改。 / p>

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。类);

int km = 0;
try {
km = Integer.parseInt(st);
}
catch(NumberFormatException e){
Log.d( NumberError:,无法转换);
}

if(ms!= null&&!ms.equals( ))
addMessageBox(ms,km);
其他
Toast.makeText(Main5Activity.this,出问题的地方,Toast.LENGTH_SHORT).show();
}

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


The code for using the childEventListener looks like this:

DatabaseReference TUidRef = usersRef.child(td);
            Log.i("hello",td);

            TUidRef.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);
                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 onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                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 onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                if(mAuth.getUid().equals(fUid))
                    Toast.makeText(Main5Activity.this,"You left the conversation", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(Main5Activity.this,"User left the conversation", Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

The usersRef is defined as:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference usersRef = rootRef.child("users");

The queer thing is that, it works when I attach the childEventListener to usersRef, but logically I need to listen to changes only specific to the variable td.

The value of td is the uid of the child needed to be listened.

The database looks like this:

解决方案

In that case you should use a ValueEventListener, which listens to a single node at once. The code is quite similar:

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();
    }
});

这篇关于为什么childEventListener不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆