Моя активность завершается и переходит к предыдущей активности без необходимого для этого кода

#java #android #firebase #android-intent #android-activity

# #java #Android #firebase #android-намерение #android-активность

Вопрос:

Я столкнулся со странной проблемой, я пытаюсь обновить свою текущую активность, поэтому я передал ту же активность, что и оба аргумента intent, Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class); а затем finish(); появляется после этого, поэтому у меня не было бы двух одновременных запусков одного и того же действия, но то, что приложение делает, когда я его запускаю,в первую очередь он показывает всплывающее окно из совершенно другого действия, которое является вторым в строке предыдущих действий, которое не приводит ни к текущему действию, ни к текущему. текущее действие приводит к нему, показанный всплывающий список не относится к текущему действию, затем он переходит к непосредственному предыдущему действию, а затемнаконец, к этой текущей активности я хотел, чтобы она переходила, точно так же, как она распознает finish(); код перед кодом намерения, но я знаю, что где-то что-то не так, потому что я определенно предоставил finish() после Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class); startActivity(intent);

Это метод, в котором находится кодовая точка, в которой я сталкиваюсь с проблемами

 private void Updatecredentials2(String textfullname, String textUsername, String textemail, String text_del_phone, String textAddress, String stateAddress, String townAddress) {

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
        HashMap<String, Object> userdata = new HashMap<>();
        userdata.put("email", textemail);
        userdata.put("name", textfullname);
        userdata.put("username", textUsername);
        userdata.put("delieveryphone", " 234"   text_del_phone);
        userdata.put("address", textAddress);
        userdata.put("State", stateAddress);
        userdata.put("Town", townAddress);

        databaseReference.child(path).updateChildren(userdata).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(Profile_Page_Activity.this, "Credentials updated successfully", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(Profile_Page_Activity.this, "Credentials update was unsuccessful", Toast.LENGTH_SHORT).show();
                }
            }
        });

    } 
 

Этот метод приводит к вышеуказанному методу

 private void validateupdate2() {
        final String textfullname = fullname.getText().toString();
        final String textUsername = username.getText().toString();
        final String textemail = email.getText().toString();
        final String text_del_phone = del_phone.getText().toString();
        final String textAddress = address.getText().toString();
        final String stateAddress = state.getSelectedItem().toString();
        final String townAddress = town_et.getText().toString();

        if (TextUtils.isEmpty(textfullname) || TextUtils.isEmpty(textUsername) || TextUtils.isEmpty(textemail) || TextUtils.isEmpty(text_del_phone) || TextUtils.isEmpty(textAddress)) {
            Toast.makeText(Profile_Page_Activity.this, "Please fill out all fields", Toast.LENGTH_SHORT).show();
        } else {
            DatabaseReference cred_check = FirebaseDatabase.getInstance().getReference("Usernames");
            cred_check.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for(DataSnapshot suu : snapshot.getChildren()){
                        if(suu.getValue().toString().equalsIgnoreCase(Prevalent.currentOnlineUser.getUsername())){
                            continue;
                        }
                        if(suu.getValue().toString().equalsIgnoreCase(textUsername)){
                            Toast.makeText(Profile_Page_Activity.this, "Username is taken, please provide another one", Toast.LENGTH_SHORT).show();
                        }else{
                            Updatecredentials2(textfullname, textUsername, textemail, text_del_phone, textAddress, stateAddress, townAddress);
                            break;
                        }
                    }
                }

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

                }
            });
        }
    }
 

Это метод из совершенно другого действия, в котором находится тост, который отображается в моем приложении, тост «Уже зарегистрирован» — это тот, который показывает

 private void Allowaccess(final String useremail, final String userpassword) {
        final DatabaseReference cref;
        cref = FirebaseDatabase.getInstance().getReference("Users");
        cref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String email = useremail;
                String password = userpassword;

                if (snapshot.hasChild(email.replace(".", " "))) {
                    Users userdata = snapshot.child(email.replace(".", " ")).getValue(Users.class);
                    if (snapshot.child(email.replace(".", " ")).child("password").getValue().toString().equals(password)) {
                        Toast.makeText(MainActivity.this, "Already Logged in", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(MainActivity.this, HomeActivity2.class));
                        Prevalent.currentOnlineUser = userdata;
                        finish();
                    } else {
                        Toast.makeText(MainActivity.this, "Your password might have changed since your last login.", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(MainActivity.this, Login_Activity.class));
                        finish();
                    }
                } else {
                    Toast.makeText(MainActivity.this, "User does not exist", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(MainActivity.this, Login_Activity.class));
                    finish();
                }
            }

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

            }
        });
    }

 

Ответ №1:

Что касается проблемы Allowaccess метода — похоже, что прослушиватель внутри этого метода запускается всякий раз, когда вы что-то обновляете в базе данных firebase. При Profile_Page_Activity выполнении databaseReference.child(path).updateChildren(userdata) , которое предположительно запускает любых зарегистрированных слушателей, например, cref.addValueEventListener в Allowaccess методе. Таким образом, решением было бы удалить ValueEventListener после того, как вы успешно вошли в систему, чтобы никакие другие изменения в него не вносились.

Что касается обновления вашей активности, я думаю, что более подходящим подходом было бы просто вызвать recreate() метод, когда вы хотите обновить свою активность.

Комментарии:

1. Да, спасибо, проблема была в прослушивателе, и я знаю, что addValueEventListener запускает метод onDataChanged при изменении в этом местоположении, поэтому я изменил его на addListenerForSingleValueEvent вместо этого я заметил, что снимок, вызывающий изменение, и снимок Allowaccess имеет доступ к тому же местоположению, поэтому мне интересно, как изменение вобщее расположение моментального снимка другого действия влияет на действие, в котором находится метод Allowaccess, который затем запускает onDataChanged из Allowaccess

2. Я думал, что действие закончилось, когда я вызвал метод finish(), и даже если какое-либо другое действие имеет снимок, который указывает на то же местоположение, а затем вызывает изменение в этом местоположении, тогда это не влияет на уже завершенное действие. Метод воссоздания работает, другой подход был грубым, еще раз спасибо.

3. Причина Allowaccess , по которой это вызвано, заключается в том, что your DatabaseReference , вероятно, отслеживает всех зарегистрированных слушателей, независимо от того, в каком виде деятельности они зарегистрированы. Так что, если addListenerforSingleValueEvent срабатывает только один раз, это должно быть исправлено.

4. О, тогда это имеет смысл, большое спасибо!

Ответ №2:

Чтобы обновить свою активность, вы должны вызвать recreate() метод