глобальное значение отличается, когда я вызываю его вне слушателя [duplicate]

нет способа сделать это в css2. вы можете добавить класс в li и ссылаться на a

li.active > a {
    property: value;
}
0
задан adjuremods 6 November 2016 в 23:51
поделиться

2 ответа

Это потому, что Firebase все еще не извлекал данные в то время, когда вы делаете:

Log.d(TAG, mName);

mName в настоящее время является нулевым, поскольку эта строка была выполнена до того, как Firebase получила данные.

Чтобы решить эту проблему, вы должны Log.d(TAG, mName) использовать метод onDataChange. В противном случае это будет null, поскольку вы еще не установили значение (поскольку Firebase все еще не получил значение).

1
ответ дан Ab_ 20 August 2018 в 08:37
поделиться

Как говорили другие: все данные из базы данных Firebase считываются асинхронно. Легче всего это увидеть, добавив еще несколько операторов журнала в ваш код:

Log.d(TAG, "Before attaching listener");
mDatabase.child("Admin")
        .child("Info")
        .child(uid)
        .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.d(TAG, "In listener's onDataChange");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "getUser:onCancelled", databaseError.toException());
    }
});
Log.d(TAG, "After attaching listener");

В отличие от того, что вы можете ожидать, вывод этого:

Перед подключением слушателя

После подключения слушателя

Внутри прослушивателя onDataChange

. Способ борьбы с асинхронным поведением состоит в том, чтобы пересмотреть вашу проблему.

В настоящий момент ваш код написан: сначала мы загружаем данные, затем записываем его.

Если вы переделаете проблему на: «всякий раз, когда данные загружаются, мы заносим их в журнал» , вы получите код следующим образом:

mDatabase.child("Admin")
        .child("Info")
        .child(uid)
        .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        UserDetails info = dataSnapshot.getValue(UserDetails.class);
        Log.d(TAG, String.valueOf(dataSnapshot));

        mName = info.getName();
        Log.d(TAG, mName);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "getUser:onCancelled", databaseError.toException());
    }
});

Таким образом, весь код, который нуждается в данных, должен находиться внутри onDataChange(). Кроме того, вы можете создать свой собственный метод обратного вызова и вызвать его из onDataChange(). Но логика всегда одна и та же: код, который нуждается в данных, запускается из onDataChange() , когда данные доступны .

1
ответ дан Frank van Puffelen 20 August 2018 в 08:37
поделиться
  • 1
    Отличное объяснение, большое спасибо. Но в этом возникает еще один вопрос: как мне передать данные на другую деятельность на месте. Я пытался хранить данные с помощью sqlite внутри метода onDataChange. Но чтобы получить его, мне нужно закрыть и снова открыть приложение. – user3606920 6 November 2016 в 11:33
Другие вопросы по тегам:

Похожие вопросы: