Я новичок в разработке приложений (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» по порядку.




создайте новый файл:
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
Когда вы работаете с сетевым подключением или вызываете API для получения данных с сервера, вы должны использовать фоновый поток, и после завершения задачи ваш код в OnComplete запускается. но основной поток не останавливается для вашей задачи и последовательно запускает весь код из метода OnComplete.
В этой ситуации вы можете использовать CallBackMethod.
спасибо, сейчас печатаю. также дал мне представление об интерфейсах и обратных вызовах.