addListenerForSingleValueEvent被多次触发

时间:2018-10-20 15:09:49

标签: java android firebase firebase-realtime-database

我在我的应用中使用firebase数据库。我正在使用addListenerForSingleValueEvent Listner来更新数据库中的数据。我发现数据没有正确更新,调试代码后,我发现侦听器已经工作了5次!!

            if (player1Score == player2Score) {
            player1Reference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Log.v("pointsDebug", "onDataChanged1");
                    long points = (long) dataSnapshot.child("points").getValue();
                    usersReference.child(player1Uid).child("points").setValue(points + 1);

                    usersReference.removeEventListener(this);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            player2Reference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Log.v("pointsDebug", "onDataChanged2");
                    long points = (long) dataSnapshot.child("points").getValue();
                    usersReference.child(player2Uid).child("points").setValue(points + 1);

                    usersReference.removeEventListener(this);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

这是重复的日志:

10-20 17:03:43.841 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged1
10-20 17:03:43.841 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged2
10-20 17:03:43.881 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged1
10-20 17:03:43.881 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged2
10-20 17:03:43.921 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged1
10-20 17:03:43.921 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged2
10-20 17:03:43.971 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged1
10-20 17:03:43.971 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged2
10-20 17:03:44.691 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged1
10-20 17:03:44.701 19217-19217/com.mk.playAndLearn V/pointsDebug: onDataChanged2

数据库结构是这样的:

users
   -user1
        -....
   -user2
        -.....

1 个答案:

答案 0 :(得分:1)

删除监听器的最佳方法是根据当前Activity的Android生命周期进行操作。

但是,您正在删除onDataChange()内部的侦听器。我猜这就是为什么这样。

usersReference.removeEventListener(this);中删除以下行:onDataChange(),或在onDestory()方法中删除侦听器:

@Override
protected void onDestroy() {
    super.onDestroy();
    usersReference.removeEventListener(YourActivity.this);
}

剩下的事情将由Android完成。