Активность не останавливается для ответа

Я новичок в разработке приложений (Android Studio). У меня есть два класса: один основной, а другой класс (база данных), который подключается к firebase и проверяет, существует ли пользователь или нет, и отвечает соответственно true или false, а также распечатывает некоторые утверждения. Проблема в том, что студия Android не ждет ответа, даже если задача выполнена успешно, и отвечает ложью. оператор печати, который я должен получить в logcat, должен быть "здесь 1", "здесь 2", а затем "здесь 3". но это дает мне «здесь 2», «здесь 3», а затем «здесь 1».

Я знаю, что это должно что-то делать с потоками или чем-то в этом роде.

public class loginpage extends AppCompatActivity {
    private Button Login;
    private EditText user_email_txt;
    private EditText user_password_txt;
    private ProgressBar wait_bar;
    private String[] user_name_password ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        find_all_views();

        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getuser_login_details();
                disable_all_views();
                Activate_wait_bar();
                final Database login = new Database();
                boolean decision = login.sign_in(user_name_password[0], user_name_password[1]);
                System.out.println("here 3");
            }
        });

    }

    private void find_all_views() {
        user_email_txt =  findViewById(R.id.UserName);
        user_password_txt = findViewById(R.id.Password);
        Login = findViewById(R.id.submit_button);
        wait_bar =  findViewById(R.id.wait_bar);
    }

    private void getuser_login_details() {
        user_name_password =  new String[2];
        user_name_password[0] = user_email_txt.getText().toString();
        user_name_password[1] = user_password_txt.getText().toString();
    }

    private void disable_all_views() {
        user_email_txt.setVisibility(View.INVISIBLE);
        user_password_txt.setVisibility(View.INVISIBLE);
        Login.setVisibility(View.INVISIBLE);
    }

    private void Activate_wait_bar() {
        wait_bar.setVisibility(View.VISIBLE);
    }
}
public class Database  {
    private FirebaseAuth connect_databse;
    private boolean authorisation;
    public Database() {}

    public boolean sign_in(String user_name, String Password) {
        authorisation = false;
        connect_databse = FirebaseAuth.getInstance();
        connect_databse.signInWithEmailAndPassword(user_name, Password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            FirebaseUser user = connect_databse.getCurrentUser();
                            authorisation =  true;
                            System.out.println("here 1");
                        }
                    }
                });
        System.out.println("here 2");
       return authorisation;
    }
}

если задача выполнена успешно, она должна вернуть авторизацию = true с операторами печати «здесь 1», «здесь 2», а затем «здесь 3» по порядку.

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

Ответы 2

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

создайте новый файл:

interface OnCompleteListener {
    void onComplete();
}

В классе базы данных:

 public class Database {

private FirebaseAuth connect_databse;

private boolean authorisation;

public Database() {

}

public void sign_in(String user_name, String Password,final OnCompleteListener listener) {

    authorisation = false;

    connect_databse = FirebaseAuth.getInstance();

    connect_databse.signInWithEmailAndPassword(user_name, Password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        FirebaseUser user = connect_databse.getCurrentUser();
                        authorisation =  true;
                        System.out.println("here 1");
                        listener.onComplete();
                        System.out.println("here 2");
                    }
                }
            });
}

В действии:

Login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        getuser_login_details();

            disable_all_views();

            Activate_wait_bar();

           final Database login = new Database();

           boolean decision = login.sign_in(user_name_password[0], user_name_password[1], new OnCompleteListener{
               @Override
               public void onComplete(){
                    System.out.println("here 3");
               }
           });

        }
    });

спасибо, сейчас печатаю. также дал мне представление об интерфейсах и обратных вызовах.

zaif687 17.07.2019 15:27

Если мой ответ помог вам решить эту проблему. пожалуйста, отметьте это как правильное и проголосуйте за него. Спасибо @zaif687

Birju Vachhani 17.07.2019 16:28

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

В этой ситуации вы можете использовать CallBackMethod.

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