#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
, по которой это вызвано, заключается в том, что yourDatabaseReference
, вероятно, отслеживает всех зарегистрированных слушателей, независимо от того, в каком виде деятельности они зарегистрированы. Так что, еслиaddListenerforSingleValueEvent
срабатывает только один раз, это должно быть исправлено.4. О, тогда это имеет смысл, большое спасибо!
Ответ №2:
Чтобы обновить свою активность, вы должны вызвать recreate()
метод