addListenerForSingleValueEvent запускается несколько раз - PullRequest
0 голосов
/ 20 октября 2018

Я использую базу данных 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 голосов
/ 20 октября 2018

Лучший и идеальный подход для удаления слушателя - это сделать его на основе жизненного цикла Android текущего Activity.

Но вы удаляете слушателя из onDataChange().Я думаю, именно поэтому это происходит.

Либо удалите эту строку: usersReference.removeEventListener(this); из onDataChange(), либо удалите слушателя внутри onDestory() метод:

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

Android сделает все остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...