Kes*_*hav 12 java firebase firebase-realtime-database
我想在特定字段的值为true时从firebase ref中删除addValueEventListener侦听器.
ValueEventListener valueListener=null;
private void removeListener(Firebase fb){
if(valueListener!=null){
**fb.removeEventListener(valueListener);**
}
}
String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data";
final Firebase fb = new Firebase(key);
valueListener=fb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snap) {
final HashMap<String, Object> data=(HashMap<String, Object>) snap.getValue();
if( data.get("attemptFinish_"+nodeId)!=null){
boolean title = (boolean) snap.child("attemptFinish_"+nodeId).getValue();
if(title){
removeListener(fb);
}
}
}
@Override
public void onCancelled() {
// TODO Auto-generated method stub
}
});
Run Code Online (Sandbox Code Playgroud)
但是没有删除addValueEventListener并且为firebase ref调用它.因此,如果需要,请建议我如何从任何firebase ref中删除监听器.
Fra*_*len 16
您可以使用以下命令从回调中删除侦听器:
ref.removeEventListener(this);
Run Code Online (Sandbox Code Playgroud)
这是一个完整的片段:
String key="https://boiling-heat-3083.firebaseio.com/baseNodeAttempt/" + userId+"/"+nodeType+"/"+nodeId+"/data";
final Firebase ref = new Firebase(key);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snap) {
if (snap.hasChild("attemptFinish_"+nodeId) {
boolean isFinished = (boolean) snap.child("attemptFinish_"+nodeId).getValue();
if(isFinished){
ref.removeEventListener(this);
}
}
}
@Override
public void onCancelled() {
// TODO Auto-generated method stub
}
});
Run Code Online (Sandbox Code Playgroud)
我删除了HashMap,而不是使用方法DataSnapshot来完成相同的操作.我还将一些变量重命名为更清晰/更惯用.
确保在DatabaseReference上添加和删除侦听器到同一节点.例如:
//when declared like this, mDatabaseReference will point to the parent node by default
private DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//listener added to child node "path_2"
mDatabaseReference.child(path_1).child(path_2).addChildEventListener(myListener);
}
Run Code Online (Sandbox Code Playgroud)
你的听众就是这种情况指向path_2.如果您尝试使用此代码删除您的侦听器
//mDatabaseReference pointing to parent node (default behaviour)
mDatabaseReference.removeEventListener(myListener);
Run Code Online (Sandbox Code Playgroud)
它将无法工作,因为您试图从错误的节点中删除侦听器.正确的方法是
mDatabaseReference.child(path_1).child(path_2).removeEventListener(myListener);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17608 次 |
| 最近记录: |