Hier und da benötigen Sie in Ihrem Android-Projekt Möglichkeiten, um Code wiederholt oder nach einem bestimmten Zeitraum auszuführen. Es gibt den Standardweg, die Handler-Klasse zu verwenden, aber das kann zu Speicherlecks in Ihrer App führen. In diesem Artikel werden wir uns einige einfache Drittanbieterlösungen für dieses Problem ansehen.
Fragen, die dieser Artikel beantwortet
- Wie führt man ein Stück Code wiederholt aus?
- Wie führt man ein Stück Code nach einer bestimmten Dauer aus?
(a) Lösung 1: Verwenden Sie every-after
Android-Bibliothek, um Aufgaben nach einer bestimmten Zeit (optional wiederholt) auszuführen, ohne sich Gedanken über Speicherlecks zu machen!
every-after
ist eine Android-Bibliothek, um ein Stück Code (optional wiederholt) nach einem bestimmten Zeitintervall auszuführen. Sie stellt Erweiterungsfunktionen auf LifecycleOwner zur Verfügung, um dies zu erreichen.
Dokumentation
Funktion | Beschreibung |
---|---|
LifecycleOwner.every(time, unit, action) |
Führt action nach jeder time in unit Einheiten aus. Beispiel: time=2 unit=seconds impliziert alle 2 Sekunden |
LifecycleOwner.everySecond(action) |
Führt Aktion jede Sekunde aus |
LifecycleOwner.everyMinute(action) |
Führt Aktion jede Minute aus |
LifecycleOwner.after(time, unit, action) |
Führt action einmal nach time in unit Einheiten aus |
Wie wird installiert?
- In der Projektebene
build.gradle
:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- In der App-Ebene
build.gradle
:
dependencies {
implementation 'com.github.sidhuparas:every-after:1.1'
}
Beispiel
Hier ist ein vollständiges Beispiel in Kotlin:
MainActivity.kt
package com.paras.everysample
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.paras.every.after.after
import com.paras.every.every
import com.paras.every.everyMinute
import com.paras.every.everySecond
import java.util.concurrent.TimeUnit
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val sec = everySecond { time ->
log("1. $time")
}
everyMinute { time ->
log("2. $time")
}
after(1, TimeUnit.MINUTES) {
sec.cancel()
log("3. Done")
}
every(1, TimeUnit.MINUTES) { time ->
log("4. $time")
}
}
private fun log(message: Any?) {
Log.d("Every-After", message.toString())
}
}
FAQ
-
Ich kann
Handler
verwenden, um die Funktionalität derafter
Funktion zu replizieren. Warum sollte ich die Funktionafter
oder diese Bibliothek benötigen? Antwort: Handler ist oft dafür bekannt, dass sie bei unvorsichtiger Verwendung Speicherlecks verursachen. Mit every-after müssen Sie sich nicht darum kümmern, die Aufgabe abzubrechen, wenn eine Aktivität oder ein Fragment zerstört wird. Es wird automatisch erledigt. -
Kann ich Aufgaben selbst abbrechen? Antwort: Ja, jede Funktion gibt ein Objekt zurück, das die Schnittstelle
Cancellable
implementiert hat. Rufen Sie einfach die Funktioncancel()
auf, um die Aufgabe abzubrechen. - Ich habe keinen Zugriff auf das Objekt LifecycleOwner. Ich kann die Aufgabe selbst abbrechen. Kann ich die Funktionen ohne LifecycleOwner verwenden? Antwort: Derzeit nicht. Demnächst verfügbar.
Referenz
Die vollständige Referenz finden Sie hier.