Java 使用firebase ValueEventListener检测值更改

Java 使用firebase ValueEventListener检测值更改,java,android,firebase,firebase-realtime-database,event-listener,Java,Android,Firebase,Firebase Realtime Database,Event Listener,我正在尝试检测Firebase数据库中的值更改。以下是我初始化ValueEventListener的代码: valueEventListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { try { String customerLocation =

我正在尝试检测Firebase数据库中的值更改。以下是我初始化ValueEventListener的代码:

valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                String customerLocation = String.valueOf(dataSnapshot.getValue());
                Point customerPoint = locationFounder.getPoint(customerLocation);

                if (customerPoint != null) {
                    databaseReference.child("isActive").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            boolean isActive = Boolean.valueOf(String.valueOf(dataSnapshot.getValue()));

                            displayPopUp(isActive, customerPoint, customerLocation);
                        }

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

                        }
                    });
                }
            } catch (Exception e) {
                Log.d("Listener",e.toString());
            }
        }

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

        }
    };
    destinationReference.addValueEventListener(valueEventListener);
当我想在活动中调用此侦听器时出现问题。我一直在尝试:

destinationListener.getValueEventListener().onDataChange(REQUIRED_SNAPSHOT);

我不知道如何获取onDataChange所需的datasnapshot。如果可能的话,我想用ValueEventListener而不是ChildEventListener来完成这项工作。然而,我不确定这是否是检测值变化的正确方法。如果有任何其他方法可以正常工作,我想知道

Firebase实时数据库没有内置任何内容来告诉您快照下的哪些特定数据在
onDataChange
方法中发生了更改

如果您想知道哪些特定属性发生了更改,您需要:

  • 将您在
    onDataChange
    中获得的快照保留在一个字段中
  • 调用
    onDataChange
    时,将新快照中的数据与字段中的数据进行比较
  • 假设您在JSON中的某个节点上有一个引用,该节点下有一个
    status
    属性,您希望同时侦听整个节点,并检测
    status
    是否已更改

    你可以这样做:

    // Add a field to your class to keep the latest snapshot
    DataSnapshot previousSnapshot;
    
    // Then add your listener
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            bool wasActive = false;
            if (previousSnapshot != null && previousSnapshot.child("status").exists()) {
                wasActive = dataSnapshot.child("status").getValue(Boolean.class);
            }
            boolean isActive = dataSnapshot.child("status").getValue(Boolean.class);
    
            if (isActive <> wasActive) {
                ... the user's status changed
            }
    
            previousSnapshot = dataSnapshot;
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // never ignore errors
        }
    });
    
    
    //向类中添加一个字段以保留最新快照
    DataSnapshot-previousSnapshot;
    //然后添加您的侦听器
    databaseReference.addValueEventListener(新的ValueEventListener(){
    @凌驾
    public void onDataChange(@NonNull DataSnapshot DataSnapshot){
    bool wasActive=false;
    如果(previousSnapshot!=null&&previousSnapshot.child(“状态”).exists()){
    wasActive=dataSnapshot.child(“status”).getValue(Boolean.class);
    }
    boolean isActive=dataSnapshot.child(“status”).getValue(boolean.class);
    如果(isActive是活动的){
    …用户的状态已更改
    }
    previousSnapshot=dataSnapshot;
    }
    @凌驾
    已取消的公共void(@NonNull DatabaseError DatabaseError){
    抛出databaseError.toException();//永远不要忽略错误
    }
    });
    
    Firebase实时数据库没有内置任何内容来告诉您快照下的哪些特定数据在
    onDataChange
    方法中发生了更改

    如果您想知道哪些特定属性发生了更改,您需要:

  • 将您在
    onDataChange
    中获得的快照保留在一个字段中
  • 调用
    onDataChange
    时,将新快照中的数据与字段中的数据进行比较
  • 假设您在JSON中的某个节点上有一个引用,该节点下有一个
    status
    属性,您希望同时侦听整个节点,并检测
    status
    是否已更改

    你可以这样做:

    // Add a field to your class to keep the latest snapshot
    DataSnapshot previousSnapshot;
    
    // Then add your listener
    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            bool wasActive = false;
            if (previousSnapshot != null && previousSnapshot.child("status").exists()) {
                wasActive = dataSnapshot.child("status").getValue(Boolean.class);
            }
            boolean isActive = dataSnapshot.child("status").getValue(Boolean.class);
    
            if (isActive <> wasActive) {
                ... the user's status changed
            }
    
            previousSnapshot = dataSnapshot;
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // never ignore errors
        }
    });
    
    
    //向类中添加一个字段以保留最新快照
    DataSnapshot-previousSnapshot;
    //然后添加您的侦听器
    databaseReference.addValueEventListener(新的ValueEventListener(){
    @凌驾
    public void onDataChange(@NonNull DataSnapshot DataSnapshot){
    bool wasActive=false;
    如果(previousSnapshot!=null&&previousSnapshot.child(“状态”).exists()){
    wasActive=dataSnapshot.child(“status”).getValue(Boolean.class);
    }
    boolean isActive=dataSnapshot.child(“status”).getValue(boolean.class);
    如果(isActive是活动的){
    …用户的状态已更改
    }
    previousSnapshot=dataSnapshot;
    }
    @凌驾
    已取消的公共void(@NonNull DatabaseError DatabaseError){
    抛出databaseError.toException();//永远不要忽略错误
    }
    });
    
    您无法创建自己的
    DataSnapshot
    。为什么需要这样做?因为我需要快照作为参数来调用函数destinationListener.getValueEventListener().onDataChange(必需的快照);(我把它命名为REQUIRED_SNAPSHOT,因为我不知道应该有什么)。然而,如果你知道其他的方法,如果你能帮上忙,那就太好了:)这看起来像是一个错误。为什么需要在代码中进行调用?我从来都不需要自己给听众打电话,只需要依靠Firebase来打电话。这里请参考您的答案:我尝试在我的应用程序中实现它。然而,我再次表示,我不确定这是正确的方法,但我愿意学习如何检测firebase数据库中的特定值何时发生更改。谢谢假设您有以前数据的快照。正如我在第一条评论中所说,您不能自己创建快照。您不能创建自己的
    DataSnapshot
    。为什么需要这样做?因为我需要快照作为参数来调用函数destinationListener.getValueEventListener().onDataChange(必需的快照);(我把它命名为REQUIRED_SNAPSHOT,因为我不知道应该有什么)。然而,如果你知道其他的方法,如果你能帮上忙,那就太好了:)这看起来像是一个错误。为什么需要在代码中进行调用?我从来都不需要自己给听众打电话,只需要依靠Firebase来打电话。这里请参考您的答案:我尝试在我的应用程序中实现它。然而,我再次表示,我不确定这是正确的方法,但我愿意学习如何检测firebase数据库中的特定值何时发生更改。谢谢假设您有以前数据的快照。正如我在第一条评论中所说,您不能自己创建快照。非常感谢。我现在可以检测到值的变化!当ValueEventListener不再有效时,请记住将其从DatabaseReference中删除(如活动或片段的onDestroy()),非常感谢。我现在可以检测到值的变化!当ValueEventListener不再有效时,请记住将其从DatabaseReference中删除(如活动或片段的onDestroy()