【问题标题】:Detect value change with firebase ValueEventListener使用 firebase ValueEventListener 检测值变化
【发布时间】:2020-07-23 11:01:42
【问题描述】:

我正在尝试从我的 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 所需的数据快照。如果可能的话,我想使用 ValueEventListener 而不是 ChildEventListener 来完成这项工作。但是,我不太确定这是尝试检测值变化的正确方法。如果有任何其他方式可以正常工作,我想知道它。

【问题讨论】:

  • 您无法创建自己的DataSnapshot。为什么需要这样做?
  • 因为我需要快照作为参数来调用函数destinationListener.getValueEventListener().onDataChange(REQUIRED_SNAPSHOT); (我将它命名为 REQUIRED_SNAPSHOT 因为我不知道应该在那里)。但是,如果您知道任何其他方法可以做到这一点,如果您能提供帮助会很好:)
  • 这似乎是XY problem。为什么需要在代码中进行调用?我从来不需要自己调用监听器,只依靠 Firebase 来调用它们。
  • 在这里参考您的答案:stackoverflow.com/questions/51367944/… 我试图在我的应用程序中实现它。但是,我再次说我不确定这是正确的方法,但我愿意学习如何检测 Firebase 数据库中的特定值何时发生变化。谢谢!
  • 假设您有以前数据的快照。正如我在第一条评论中所说,您不能自己创建快照。

标签: java android firebase firebase-realtime-database event-listener


【解决方案1】:

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

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

  1. 将您在onDataChange 中获得的快照保存在字段中。
  2. 当调用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
    }
});

【讨论】:

  • 非常感谢。我现在可以检测到值变化了!
  • 当ValueEventListener不再有效时,记得从DatabaseReference中移除它(比如你的activity或fragment的onDestroy())
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多