Подождите, пока firebase не получит данные для продолжения (Kotlin)

#android #kotlin

#Android #kotlin

Вопрос:

Я хочу иметь функцию, которая возвращает значение, которое я получаю от firebase, но асинхронное программирование делает это очень сложным. Я хочу иметь возможность ждать, пока (очки! = -500). Однако каждый раз, когда я пытаюсь подождать, кажется, что задача получения значения очков из firebase также останавливается.

Я могу жестко запрограммировать его на ожидание 3 секунды, но я бы предпочел проверять каждые полсекунды, чтобы увидеть, изменилось ли значение points, а затем возвращать значение, которое я получил из базы данных. Я также знаю, что могу извлекать точки из текстового представления, которое я изменил, но я чувствую, что это нарушает целостность моего приложения.

Вот код, с которым я работаю

 getPoints() {
    var points= "-500"
    val ref = FirebaseDatabase.getInstance().getReference("Edit").child(storeName).child(
        FirebaseAuth.getInstance().currentUser!!.uid
    )

    ref.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            points= snapshot.child("points").value.toString()
            pointsNumberTextView.text = points
        }

        override fun onCancelled(error: DatabaseError) {
            Toast.makeText(context, "Err 11 Database reach cancelled", Toast.LENGTH_LONG).show()
        }
    })
 //wait until (points != 500) then return points
  

}

Ответ №1:

Синхронное выполнение не является вариантом, но для этого можно использовать a Query :

 ref.child("points").orderByValue().startAt("-500").endAt("500")
  

Просто немного сложно сказать наверняка, потому что нет образцов данных;
я надеюсь, что это, по крайней мере, должно подтолкнуть вас в правильном направлении.

Комментарии:

1. Я ценю быстрый ответ. Снимок.дочерний элемент («Точки»).значение. toString() вернет значение от 1 до 50 (то есть то, что будет сохранено в базе данных).

2. Поэтому, если это значение очков было «25», я бы хотел подождать, пока оно не получит очки из базы данных, а затем вернет «25». Я как бы хочу имитировать синхронное действие в некотором роде.