Wie man eine Funktion mit Verzögerung in Kotlin aufruft: Vollständiger Leitfaden mit Code

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Sie das jetzt brauchen

\n

Stellen Sie sich vor: Sie schreiben eine App und müssen dem Benutzer 5 Sekunden nach einem Button-Klick eine Benachrichtigung anzeigen. Oder eine Serveranfrage erst 2 Sekunden ausführen, nachdem der Benutzer die Texteingabe beendet hat. Oder einfach eine schöne Animation mit Verzögerung erstellen. Ohne die Fähigkeit, eine Funktion mit Verzögerung in Kotlin aufzurufen, geht es nicht.

\n

Diese Frage ist eine der beliebtesten auf Stack Overflow (tausende Aufrufe!) und das zu Recht. In Kotlin gibt es ganze 4 Möglichkeiten, einen verzögerten Aufruf zu realisieren, und jede ist für ihre eigene Situation geeignet. In diesem Artikel werden wir sie alle durchgehen: von der einfachen delay() in Coroutines bis zum klassischen Handler für Android. Sie erfahren, welche Methode Sie wählen sollten und warum, und vor allem sehen Sie funktionierenden Code, den Sie sofort in Ihr Projekt kopieren können.

\n\n

Methode 1: Coroutines und delay() (modern und bevorzugt)

\n

Dies ist die eleganteste und empfohlene Methode im modernen Kotlin. Coroutines sind leichtgewichtige Threads, die den Hauptthread nicht blockieren. Die Methode delay() pausiert die Coroutine für die angegebene Zeit und setzt sie dann fort.

\n

Um mit Coroutines zu arbeiten, müssen Sie die Abhängigkeit in build.gradle.kts hinzufügen:

\n
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
\n

Und so sieht es im Code aus:

\n
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    println("Start: ${System.currentTimeMillis()}")\n\n    // Coroutine mit Verzögerung starten\n    launch {\n        delay(3000L) // 3 Sekunden warten\n        println("3 Sekunden vergangen: ${System.currentTimeMillis()}")\n        myDelayedFunction() // gewünschte Funktion aufrufen\n    }\n\n    println("Warten... (dies wird sofort ausgeführt)")\n}\n\nfun myDelayedFunction() {\n    println("Funktion ausgeführt!")"
\n

Wichtig: delay() ist eine aussetzende Funktion (suspend function). Sie kann nur innerhalb einer Coroutine oder einer anderen suspend-Funktion aufgerufen werden. Wenn Sie versuchen, delay() außerhalb einer Coroutine aufzurufen, gibt der Compiler einen Fehler aus.

\n\n

Wie man einen verzögerten Aufruf in Android mit Coroutines macht

\n

In der Android-Entwicklung sind Coroutines der De-facto-Standard. Hier ist ein Beispiel für eine Activity:

\n
import androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport kotlinx.coroutines.*\n\nclass MainActivity : AppCompatActivity() {\n\n    private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        // Nach 2 Sekunden einen Toast anzeigen\n        scope.launch {\n            delay(2000L)\n            showToast("2 Sekunden vergangen!")\n        }\n    }\n\n    private fun showToast(message: String) {\n        android.widget.Toast.makeText(this, message, android.widget.Toast.LENGTH_SHORT).show()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        scope.cancel() // Alle Aufgaben beim Zerstören der Activity abbrechen\n    }\n}
\n

Beachten Sie: Wir verwenden Dispatchers.Main, um mit der UI zu arbeiten. Und wir brechen den Scope unbedingt in onDestroy() ab, um Speicherlecks zu vermeiden.

\n\n

Methode 2: Handler und postDelayed() (Android-Klassiker)

\n

Wenn Sie für Android entwickeln und keine Coroutines verwenden möchten (oder können), funktioniert der gute alte Handler immer noch. Diese Methode war vor der Ära der Coroutines beliebt.

\n
import android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.appcompat.app.AppCompatActivity\n\nclass MainActivity : AppCompatActivity() {\n\n    private val handler = Handler(Looper.getMainLooper())\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)                

Blogs

Buchempfehlungen