Warum ein Dialog nicht sofort nach dem Tippen auf einen Menüpunkt in einer Android-App angezeigt wirdAndroid

Forum für diejenigen, die für Android programmieren
Guest
 Warum ein Dialog nicht sofort nach dem Tippen auf einen Menüpunkt in einer Android-App angezeigt wird

Post by Guest »

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:

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();
}
}
Und hier ist meine Testmethode onMenuItemSelected:

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;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post