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

  1. Wie führt man ein Stück Code wiederholt aus?
  2. 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?

  1. In der Projektebene build.gradle:

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
    }
}
  1. 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

  1. Ich kann Handler verwenden, um die Funktionalität der after Funktion zu replizieren. Warum sollte ich die Funktion after 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.
  2. Kann ich Aufgaben selbst abbrechen? Antwort: Ja, jede Funktion gibt ein Objekt zurück, das die Schnittstelle Cancellable implementiert hat. Rufen Sie einfach die Funktion cancel() auf, um die Aufgabe abzubrechen.
  3. 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.

Categorized in:

Tagged in: