Функция Upvote / downvote работает вечно, даже если она включена в прослушивателе по нажатию - PullRequest
0 голосов
/ 08 марта 2019

Я построил функцию для контроля положительных и отрицательных голосов в ответах.Точно так же, как он работает на SO.

Он отлично работает ластами - почти.

Если я позвоню один раз (нажав upvote или downvote), это вполне нормально, но если я позвоню еще раз(установите его в 0 из -1 или 1), он начинает работать вечно, прыгая через -1, 0 и 1 (я единственный пользователь, поэтому он не набирает больше 1 голоса).

Я могу 'не понимаю, что вызывает такое поведение.Я думаю, может быть, это как-то связано с тем, что он находится внутри слушателя, поэтому изменение значения продолжает зажигать функцию?Если это так, как мне получить нужное значение без слушателя?Я не уверен .. Помогите?

 private fun executeVote(vote: String) {


        val refVotes = FirebaseDatabase.getInstance().getReference("/votes/$answerId")
        refVotes.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {
                val refUserVote = FirebaseDatabase.getInstance().getReference("/votes/$answerId/$uid")

                if (p0.hasChild("$uid")) {
                    var voteValue = 0
                    refUserVote.addListenerForSingleValueEvent(object : ValueEventListener {
                        override fun onCancelled(p0: DatabaseError) {

                        }

                        override fun onDataChange(p0: DataSnapshot) {
                            voteValue = p0.getValue().toString().toInt()

                            when (voteValue) {

                                1 -> {
                                    when (vote) {
                                        "up" -> refUserVote.setValue(1)
                                        "down" -> refUserVote.setValue(0)
                                        else -> refUserVote.setValue(0)
                                    }
                                }

                                0 -> {
                                    when (vote) {
                                        "up" -> refUserVote.setValue(1)
                                        "down" -> refUserVote.setValue(-1)
                                        else -> refUserVote.setValue(0)

                                    }
                                }

                                -1 -> {
                                    when (vote) {
                                        "up" -> refUserVote.setValue(0)
                                        "down" -> refUserVote.setValue(-1)
                                        else -> refUserVote.setValue(0)

                                    }
                                }
                            }

                        }

                    })


                } else {
                    when (vote) {
                        "up" -> refUserVote.setValue(1)
                        "down" -> refUserVote.setValue(-1)
                        else -> refUserVote.setValue(0)
                    }
                }
            }


        })

    }

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Это имеет смысл, потому что когда вы вызываете setValue, onDataChange будет вызываться снова, даже если вы вызываете его из той же функции.

Когда вы собираетесь вызвать setValue, удалите прослушиватель, вызовите setValue, снова добавьте прослушиватель (это типичный способ Java).

Я бы также не стал что-то делать в других условиях, это излишне вызывает события.

0 голосов
/ 08 марта 2019

Моя проблема заключалась в использовании addValueEventListener вместо addListenerForSingleValueEvent, который, как я предполагаю, как следует из названия, прослушал бы один раз и отпустил.

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