Ich habe mit Hilfe von Rohan eine Lösung gefunden :)
Ich habe seine Antwort angepasst, um meinen Anforderungen zu entsprechen.
Wenn der Benutzer die Taste drückt, wird ein Thread gestartet. Der Thread schläft für die gewünschte Verzögerung, und wenn er aufwacht, führt er den Code aus, den ich brauche. Wenn der Benutzer loslässt, wird der Thread beendet. Dadurch wird erreicht, was ich will, denn wenn der Benutzer loslässt, bevor der Thread aufwacht, wird der Thread unterbrochen und die Aktion findet nicht statt.
Ich mag diesen Ansatz, weil er es mir ermöglicht, meine Geschäftslogik sofort nach Ablauf der Verzögerung auszuführen, was gut ist, weil ich dem Benutzer ein Feedback geben kann, um ihm zu zeigen, dass er lange genug gedrückt hat (zum Beispiel durch Vibration des Telefons).
Der Nachteil dieses Ansatzes ist: Es besteht das Risiko, dass der Benutzer die Taste loslässt, während Ihre gewünschte Aktion läuft, und den Thread beendet, bevor alles erledigt ist. Dies ist für meinen Fall kein großes Problem, weil meine Geschäftslogik sehr wenig macht; sie löst nur ein Ereignis aus, das von einer anderen Klasse verarbeitet wird. Wenn die Aktion nicht vollständig abgeschlossen wurde, ist es akzeptabel, dass der Benutzer es erneut versuchen muss.
Der Code ist etwas länger als ich möchte, aber wenn dies ein häufiges Merkmal in Ihrer Anwendung ist, ist er leicht wiederverwendbar. Hier ist ein Codebeispiel:
protected class MyLongClickListener implements View.OnTouchListener {
private Thread longClickSensor;
public boolean onTouch(View view, MotionEvent event) {
// Wenn der Benutzer drückt und es keinen Thread gibt, erstellen Sie einen und starten ihn
if (event.getAction() == MotionEvent.ACTION_DOWN && longClickSensor == null) {
longClickSensor = new Thread(new MyDelayedAction());
longClickSensor.start();
}
// Wenn der Benutzer loslässt und es einen Thread gab, stoppen Sie ihn und vergessen Sie den Thread
if (event.getAction() == MotionEvent.ACTION_UP && longClickSensor != null) {
longClickSensor.interrupt();
longClickSensor = null;
}
return false;
}
private class MyDelayedAction implements Runnable {
private final long delayMs = 1200;
public void run() {
try {
Thread.sleep(delayMs); // Eine Weile schlafen
doBusinessLogic(); // Wenn der Thread nach dem Schlafen noch aktiv ist, die Arbeit erledigen
} catch (InterruptedException e) { return; }
}
private void doBusinessLogic() {
// Stellen Sie sicher, dass diese Logik so schnell wie möglich ist, oder delegieren Sie sie an eine andere Klasse
// durch Broadcasted Intents, denn wenn der Benutzer loslässt, während die Arbeit läuft,
// wird der Thread unterbrochen.
}
}
}