Как вытащить данные из firebase в студию Android в точном месте кода?

Есть ли способ получить данные из firebase, где находится код? В настоящее время у меня есть valueEventListeners, но все они запускаются после кода под ними, что делает следующий код недействительным. Я хочу иметь возможность получить значение именно там, где находится код, а не позже.

Пока в сети ничего по этому поводу не нашел.

Хороший пример моих проблем в коде:

public void onItemClick(AdapterView<?> l, View v, final int position, long id) {

        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        final String uid = user.getUid();

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        Intent intent = new Intent();
        intent.setClass(this, ChallengeView.class);
        intent.putExtra("snapshot", cCESnapshot.toString());
        intent.putExtra("name", challengeList.get(position));
        startActivity(intent);
    }

cCESnapshot имеет значение null, так как намерение запускается перед valueEventListener.

Вы должны поместить создание намерения и startActivity в onDataChange. Вы не можете запускать сетевые запросы в основном потоке/синхронизированном.

the_dani 09.04.2019 23:29

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

Merthew 09.04.2019 23:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

onDataChange() является асинхронным, поэтому единственный способ использовать полученные данные — внутри onDataChange(), например:

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            cCESnapshot = dataSnapshot.child(uid).child("currChallenges").child(challengeList.get(position));

    Intent intent = new Intent();
    intent.setClass(this, ChallengeView.class);
    intent.putExtra("snapshot", cCESnapshot.toString());
    intent.putExtra("name", challengeList.get(position));
    startActivity(intent);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Это асинхронная операция, когда данные поступят, будет запущен обратный вызов onDataChange. Ваш код startActivty будет выполняться последовательно, поэтому вы не получите значения в cCESnapshot.

Переместите код startActivity внутрь слушателя.

Но будь осторожен, потому что каждый раз, когда будет вызываться прослушиватель кликов onItemClick, вы будете добавлять прослушиватель событий значения. Таким образом, у вас будет несколько вызовов onDataChange при каждом клике и, следовательно, несколько startActivities.

Вместо этого я рекомендую использовать addListenerForSingleValueEvent, который будет срабатывать только после однократного изменения данных.

Другие вопросы по теме