Warum ein Dialog nicht sofort nach dem Tippen auf einen Menüpunkt in einer Android-App angezeigt wird
Posted: 03 Jan 2025, 14:30
In meiner Android-Anwendung verwende ich einen Menüpunkt in einem Fragment, um eine bestimmte Aufgabe zu starten (Daten in einem Bericht aktualisieren).
Der Menüpunkt wird als Symbol angezeigt.
Wenn ich auf klicke Im Menüpunkt wird ein Fortschrittsdialog angezeigt, die Datenaktualisierung wird gestartet, dann wird der Fortschrittsdialog ausgeblendet.
Mir ist aufgefallen, dass es sehr schlimm ist, wenn man im Menü zweimal hintereinander auf das Symbol klickt Schnell hat der Fortschrittsdialog keine Zeit, zwischen den Klicks angezeigt zu werden, was dazu führt ein zweiter Versuch, einen bereits laufenden Prozess zu starten, und ein entsprechender Fehler.
Ich habe den einfachsten möglichen Testfall mit einem primitiven Dialog und einer Verzögerung von 100 ms in onCreateDialog erstellt und erhalte den gleichen Effekt.
Wenn Sie zweimal hintereinander schnell auf ein Symbol im Menü klicken, wird die Methode onMenuItemSelected zweimal aufgerufen, obwohl nach dem ersten Klick der Dialog angezeigt werden sollte und der zweite Klick unmöglich sein sollte.
Warum? Passiert das, wenn die Arbeit aller Schnittstellenelemente in einem UI-Thread erfolgen soll?
Und wie kann man das umgehen?
Hier ist meine Testdialogklasse:
Und hier ist meine Testmethode onMenuItemSelected:
Der Menüpunkt wird als Symbol angezeigt.
Wenn ich auf klicke Im Menüpunkt wird ein Fortschrittsdialog angezeigt, die Datenaktualisierung wird gestartet, dann wird der Fortschrittsdialog ausgeblendet.
Mir ist aufgefallen, dass es sehr schlimm ist, wenn man im Menü zweimal hintereinander auf das Symbol klickt Schnell hat der Fortschrittsdialog keine Zeit, zwischen den Klicks angezeigt zu werden, was dazu führt ein zweiter Versuch, einen bereits laufenden Prozess zu starten, und ein entsprechender Fehler.
Ich habe den einfachsten möglichen Testfall mit einem primitiven Dialog und einer Verzögerung von 100 ms in onCreateDialog erstellt und erhalte den gleichen Effekt.
Wenn Sie zweimal hintereinander schnell auf ein Symbol im Menü klicken, wird die Methode onMenuItemSelected zweimal aufgerufen, obwohl nach dem ersten Klick der Dialog angezeigt werden sollte und der zweite Klick unmöglich sein sollte.
Warum? Passiert das, wenn die Arbeit aller Schnittstellenelemente in einem UI-Thread erfolgen soll?
Und wie kann man das umgehen?
Hier ist meine Testdialogklasse:
Code: Select all
public class TestDlg extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
//
}
return new AlertDialog.Builder(requireContext())
.setTitle("Test title")
.setMessage("Test message")
.create();
}
}
Code: Select all
@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
if (id == R.id.mniRefresh) {
Log.d("YuTAG", "REFRESH item selected");
new TestDlg().showNow(getChildFragmentManager(), null);
return true;
}
return false;
}