Android + Firebase перезапуск активности там, где не нужно
Я столкнулся с проблемой, из-за которой не могу дальше продолжать изучать Android. Помогите пожалуйста разобраться, каждый раз когда в приложении я нажимаю одну из трех кнопок и отправляю данные о нажатии в Firebase, насколько я понимаю, происходит полная перезагрузка активности. Ее тут не задумывалось, я похоже что-то не так наделал со структурой программы или методами ValueEventListener, при нажатии кнопки должна нажиматься только кнопка, но из-за связи с БД активность после нажатия запускается заново, судя по логам
Пример вывода(Проверял, что сверка имени пользователя с БД каждый раз проходит заново после нажатия кнопки, смущает OnActivityCreated)
I/System.out: Переделал имя!
V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 585
V/FA: Activity paused, time: 19812524
V/FA: onActivityCreated
V/FA: Activity resumed, time: 19812574
I/System.out: Переделал имя!
Так как я не знаю, где именно ошибка, может и в целом в структуре, прикрепляю полный код активности с пояснениями в паре мест:
public class WorkerCabinetActivity extends AppCompatActivity {
Button btnSignOut;
FirebaseUser dbuser = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference db2 = FirebaseDatabase.getInstance().getReference();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_worker_cabinet);
btnSignOut = findViewById(R.id.sign_out_button);
RadioButton btnOnlineFree = findViewById(R.id.online_free_button);
RadioButton btnOnlineBusy = findViewById(R.id.online_busy_button);
RadioButton btnOffline = findViewById(R.id.offline_button);
initialize_view();
btnSignOut.setOnClickListener(v -> {
startActivity(new Intent(WorkerCabinetActivity.this, MainActivity.class));
finish();
});
btnOnlineBusy.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "online busy"));
btnOnlineFree.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "online free"));
btnOffline.setOnClickListener(v -> writeUserStatus(dbuser.getUid(), "offline"));
}
private void initialize_view() {
btnSignOut = findViewById(R.id.sign_out_button);
RadioButton btnOnlineFree = findViewById(R.id.online_free_button);
RadioButton btnOnlineBusy = findViewById(R.id.online_busy_button);
RadioButton btnOffline = findViewById(R.id.offline_button);
TextView helloText = findViewById(R.id.worker_cabinet_hello);
TextView clarification = findViewById(R.id.extra_cabinet_information);
check_buttons(btnOnlineFree, btnOnlineBusy, btnOffline); //Метод сверяет статус в БД и нажимает соответствующую кнопку для сохранения при перезапуске
set_name(helloText, clarification); //Метод устанавливает приветственный текст
}
private void check_buttons(RadioButton btnOnlineFree, RadioButton btnOnlineBusy, RadioButton btnOffline) {
ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("offline") && !btnOffline.isChecked()){
btnOffline.setChecked(true);
} else if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("online free") && !btnOnlineFree.isChecked()){
btnOnlineFree.setChecked(true);
} else if(Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getStatus().equals("online busy") && !btnOnlineBusy.isChecked()){
btnOnlineBusy.setChecked(true);
} else{
db2.child("Users").child(dbuser.getUid()).child("status").setValue("offline");
btnOffline.setChecked(true);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {}
};
db2.addListenerForSingleValueEvent(postListener);
}
private void set_name(TextView helloText, TextView clarification) {
ValueEventListener name_listener = new ValueEventListener() {
@SuppressLint("SetTextI18n")
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String name = Objects.requireNonNull(snapshot.child("Users/" + dbuser.getUid()).getValue(User.class)).getName();
String[] nameToken = name.split(" ");
helloText.setText("Добрый день, " + nameToken[1] + '!');
clarification.setText("Выберите статус для отображения: ");
System.out.println("Переделал имя!");
}
@Override
public void onCancelled(@NonNull DatabaseError error) {}
};
db2.addListenerForSingleValueEvent(name_listener);
}
private void writeUserStatus(String userId, String status) {
db2.child("Users").child(userId).child("status").setValue(status);
}
}
Подскажите пожалуйста, добрые люди, в чем проблема? В Гугле вроде не забанен, но там ответа на вопрос в понятной мне формулировке не имеется.
Ответы (1 шт):
Здесь вы запускаете MainActivity из своей Activity. И сразу завершает свою активность. Зачем? Естественно у вас получается перезапуск не приложения, а главного Activity. Попробуйте убрать эти строчки
btnSignOut.setOnClickListener(v -> {
startActivity(new Intent(WorkerCabinetActivity.this, MainActivity.class));
finish();
});