android - 为什么 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:", "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) {
}
});
usersRef
定义为:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
final DatabaseReference usersRef = rootRef.child("users");
奇怪的是,当我附加childEventListener
to时它可以工作usersRef
,但从逻辑上讲,我需要只听特定于变量的更改td
。
的值td
是uid
需要被倾听的孩子的值。
解决方案
在这种情况下,您应该使用 a 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();
}
});
推荐阅读
- stimulusjs - 刺激 - 如何在连接时设置变量
- typescript - 在表上插入或更新违反外键约束 TelephoneContact
- css - 更改 Switch Material UI 的颜色
- python - Python:我无法访问子列表中的单个元素。整个子列表显示为单个元素
- html - Bootstrap 4:防止向右移动的列(在 min-width:1200px 上使用浮动)将另一列向下推
- node.js - 加密/散列数据 GET 会捕获什么?
- selenium - 如何使用 gocolly twocaptcha 和 selenium 绕过重新验证码
- javascript - Bootstrap 5 - 以编程方式打开导航选项卡
- ios - 是否可以在 NSTimer 到达指定时间之前停止它?
- reactjs - 文本字段在表格 ReactJs 中无法正常工作