Firebase onDataChange пропускает сначала огонь, а затем запускается нормально - PullRequest
0 голосов
/ 07 февраля 2019

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

Общий контекст этих двух методов - получение значения по ссылке в базе данных с использованием кода / значения (указанного пути) для получения соответствующего значения.Это значение извлекается и используется в других местах программы.

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

Я только публикую первую проблему


в onCreate

databaseReference_AUTH_TABLE = FirebaseDatabase.getInstance().getReference(AUTH_TABLE_TAG); verified = false;

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

public void authenticateProductID(final String code){
    databaseReference_AUTH_TABLE.child(code).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists() && !verified){//Exists and is not verified yet
                PID = dataSnapshot.getValue().toString();
                verified = true;
                return;
            }
        }

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

        }
    });
}

public void showPopupProduct_btn(View view){
    final Dialog dialogProductVerification = new Dialog(this);
    dialogProductVerification.setContentView(R.layout.layout_popup_product);

    Button authenticate = dialogProductVerification.findViewById(R.id.btnPopupProductVerification);

    authenticate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText verificationCode = dialogProductVerification.findViewById(R.id.editTextPopupCode);
            code = verificationCode.getText().toString();
            if(noDuplicateCode(code)){
                authenticateProductID(code);
                if(verified){
                    getPackage(PID, code);
                    txtResult.setText(code);
                }
                else{
                    Toast.makeText(POSActivity.this, "Authentication Failed", Toast.LENGTH_SHORT).show();
                }
            }


        }
    });
    dialogProductVerification.show();

}

Поскольку onDataChange не запускается в первый раз, проверено ложно.Но 2-е нажатие кнопки все идеально.

узел firbase

В основном мое приложение будет завершено, когда это будет решено.Любая помощь будет высоко ценится.Заранее спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

API Firebase являются асинхронными, что означает, что метод onDataChange() возвращается сразу после его вызова, и обратный вызов из Задачи, которую он возвращает, будет вызван через некоторое время.Там нет никаких гарантий о том, сколько времени это займет.Таким образом, получение этих данных может занять от нескольких сотен миллисекунд до нескольких секунд.Поскольку этот метод немедленно возвращается, значение вашего verified логического значения, которое вы пытаетесь использовать, еще не заполнено из обратного вызова.Поэтому простое создание его как глобальной переменной вам совсем не поможет.

По сути, вы пытаетесь использовать значение синхронно с помощью асинхронного API.Это не очень хорошая идея.Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - переместить код, который запрашивает второй узел, внутри первого обратного вызова (внутри метода onDataChange ()), так называемых вложенных запросов,в противном случае, я рекомендую вам посмотреть последнюю часть моего ответа от этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

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