База данных EventListener Firebase вне действия - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Android и Kotlin, и я хочу реализовать класс FirebaseRetriever в моем проекте, который возвращает определенный снимок базы данных.

Теперь у меня возникают проблемы, что EventListener никогда не запускается и поэтому, конечно,, Я получаю нулевой объект обратно.

Вот мой класс данных:

public class FirebaseRetriever() {

    private val TAG = "FirebaseRetriever"
    private lateinit var fbData: FirebaseDatabase
    private lateinit var fbAuth: FirebaseAuth
    private lateinit var userRef: DatabaseReference
    //Snapshots
    private lateinit var userSnap: DataSnapshot

    init {
        fbData = FirebaseDatabase.getInstance()
        userRef = fbData.reference.child("users")
        fbAuth = FirebaseAuth.getInstance()

        userRef.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(e: DatabaseError) {
                Log.e(TAG, "Data could not be retrieved from Database." + e.message)
            }

            override fun onDataChange(snap: DataSnapshot) { // is never executed
                userSnap = snap 
            }

        })
    }

    public fun getUserSnap(): DataSnapshot {
        return userSnap // returns null
    }
}

Вот как я вызываю getUser ():

firebaseRetriever = FirebaseRetriever()
...
val uniSnap = firebaseRetriever.getUniSnap()

ЭтоВозможно ли, что Firebase EventListener может работать только в обычном AndroidActivity или я что-то не так делаю?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 июня 2018

Скорее всего, данные просто еще не были загружены при вызове getUserSnap.Чтобы убедиться в этом, добавьте еще несколько операторов журнала:

Log.i(TAG, "Starting to read from database.")

userRef.addValueEventListener(object : ValueEventListener {
    override fun onCancelled(e: DatabaseError) {
        Log.e(TAG, "Data could not be retrieved from Database." + e.message)
    }

    override fun onDataChange(snap: DataSnapshot) { // is never executed
        Log.i(TAG, "User read from database.")
        userSnap = snap 
    }

})

public fun getUserSnap(): DataSnapshot {
    Log.i(TAG, "Getting user.")
    return userSnap // returns null
}

Когда вы запустите свое приложение с этим, результат будет:

Начало чтения из базы данных.

Получение пользователя.

Чтение пользователем из базы данных.

Вероятно, это не тот порядок, который вы ожидали.Firebase загружает данные из базы данных асинхронно, поскольку для получения результатов может потребоваться некоторое время.Вместо того, чтобы заставлять ваше приложение ждать (что вызовет диалоговое окно «Приложение не отвечает»), вашему коду разрешено продолжать.Но когда вы звоните getUserSnap, этот пользователь еще не был загружен.

Самое простое решение - переместить весь код, которому требуется доступ для пользователя , в onDataChange().метод.Также см. Мой ответ на этот вопрос для более гибкого решения, которое требует больше кода: Метод getContactsFromFirebase () возвращает пустой список

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