当前位置:网站首页>Workmanager Learning one

Workmanager Learning one

2022-07-05 10:16:00 M. Tony.

Un.、Préface

À l'heure actuelle, dans le cadre d'une longue mission d'arrière - plan,Officiellement recommandéWorkManagerPour gérer les tâches de fond,C'est ça.WorkManagerFaites un simple enregistrement.WorkManagerLes tâches suivantes peuvent être exécutées principalement
Insérer la description de l'image ici

2.、Ajouter une dépendance

dependencies {
    
    val work_version = "2.7.1"

    // (Java only)
    implementation("androidx.work:work-runtime:$work_version")

    // Kotlin + coroutines
    implementation("androidx.work:work-runtime-ktx:$work_version")

    // optional - RxJava2 support
    implementation("androidx.work:work-rxjava2:$work_version")

    // optional - GCMNetworkManager support
    implementation("androidx.work:work-gcm:$work_version")

    // optional - Test helpers
    androidTestImplementation("androidx.work:work-testing:$work_version")

    // optional - Multiprocess support
    implementation "androidx.work:work-multiprocess:$work_version"
}

Trois、Exemple simple

UnWorkManager Trois parties sont nécessaires .Définir unWork,Créer unWorkRequest,Soumis àWorkManagerExécution. Voici un exemple simple d'une tâche ponctuelle .

WorkTest.kt

class WorkTest(val appContext: Context, workerParams: WorkerParameters): Worker(appContext, workerParams) {
    
    override fun doWork(): Result {
    
        Log.e("YM--->"," Tâches de fond en cours ,Tâche thread:${
      Thread.currentThread().id}-->Nom du fil:${
      Thread.currentThread().name}")
        return Result.success()
    }
}

Voici deux types de création WorkRequestDe la façon dont, Un complexe ,Un simple, Choisissez une mise en œuvre en fonction de la situation .

    private fun initWork() {
    
// val uploadWorkRequest: WorkRequest = // Approche complexe du constructeur 
// OneTimeWorkRequestBuilder<WorkTest>()
// .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)// Définir les tâches urgentes 
// .build()
        val uploadWorkRequest: WorkRequest = OneTimeWorkRequest.from(WorkTest::class.java)//De façon simple
        WorkManager
            .getInstance(this)
            .enqueue(periodicWorkRequest)
    }

UtiliserWorkManagerExécution

WorkManager
            .getInstance(this)
            .enqueue(periodicWorkRequest) 

Quatre、Missions périodiques

Une tâche récurrente peut être exécutée plusieurs fois . Voici comment créer

val saveRequest =
       PeriodicWorkRequestBuilder<WorkTest>(1, TimeUnit.HOURS)
    // Additional configuration
           .build()

Attention à l'heure ,Si le temps est inférieur à15Minutes, Il sera calculé en 15 minutes , Si elle est supérieure à 15 minutes, elle est calculée en fonction du temps réel .

Supposons que vous vouliez définir une période flexible , Comme une mission de 15 minutes ,Vous pouvez utiliser


val myUploadWork = PeriodicWorkRequestBuilder<SaveImageToFileWorker>(
       1, TimeUnit.HOURS, // repeatInterval (the period cycle)
       15, TimeUnit.MINUTES) // flexInterval
    .build()

Création PeriodicWorkRequest Transfert de temps flexInterval Et repeatInterval. Période flexible de repeatInterval - flexInterval C'est parti., Jusqu'à la fin de l'intervalle .

L'intervalle de répétition doit être supérieur ou égal à PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, Et l'intervalle flexible doit être supérieur ou égal à PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS.

Cinq、Contraintes de travail

Voir ici le site officiel :

ContraintesPour s'assurer que les travaux sont retardés jusqu'à ce que les meilleures conditions soient remplies.Les contraintes suivantes s'appliquent: WorkManager.

NetworkType Contrainte nécessaire pour exécuter le travail Type de réseau.Par exemple Wi-Fi ([UNMETERED](https://developer.android.google.cn/reference/androidx/work/NetworkType?hl=zh-cn#UNMETERED)).
BatteryNotLowSi défini à true,Alors quand l'appareil est dans“Mode faible puissance”Heure,Le travail ne fonctionne pas.
RequiresChargingSi défini à true,Alors le travail ne peut fonctionner que lorsque l'appareil est chargé.
DeviceIdleSi défini à true,L'appareil de l'utilisateur doit être inactif,Pour exécuter le travail. Lors de l'exécution d'une opération par lots , Cette contrainte sera très utile ; Sans cette contrainte , Les opérations par lots peuvent réduire les performances d'autres applications qui fonctionnent activement sur l'appareil utilisateur .
StorageNotLowSi défini à true,Alors quand il n'y a pas assez de mémoire sur l'appareil utilisateur,Le travail ne fonctionne pas.

Pour créer un ensemble de contraintes et les associer à un travail ,Veuillez en utiliser un Contraints.Builder() Création Constraints Exemple,Et assigner l'Instance à WorkRequest.Builder().

Par exemple,Le code suivant construit une demande d'emploi,Cette demande de travail n'est disponible que lorsque l'appareil utilisateur est chargé et connecté à Wi-Fi Ne fonctionne que sur le réseau:

val constraints = Constraints.Builder()
   .setRequiredNetworkType(NetworkType.UNMETERED)
   .setRequiresCharging(true)
   .build()

val myWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<MyWork>()
       .setConstraints(constraints)
       .build()

Si plus d'une contrainte est spécifiée,Le travail ne s'exécutera que si toutes les contraintes sont remplies.

Si une contrainte n'est plus satisfaite au moment de l'exécution du travail,WorkManager L'opérateur s'arrêtera.Le système reprendra le travail une fois que toutes les contraintes auront été respectées.

Six、Travail différé

Par défaut, la tâche ci - dessus sera exécutée immédiatement , Si vous souhaitez retarder l'exécution, vous pouvez prendre les mesures suivantes :


val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setInitialDelay(10, TimeUnit.MINUTES)
   .build()

Il est important de noter que les tâches programmées , Seule la première fois sera retardée .

Sept、 Retry and retry Policy

Si la tâche échoue , Je veux réessayer ,Vous pouvez utiliser cette méthode. Retry a deux paramètres qui composent : Temps de retry et politique de retry . Le temps de retry est le temps d'attente avant chaque retry ,Le plus court10sOu MIN_BACKOFF_MILLIS. .La stratégie de retry est la façon dont le temps de retry subséquent augmente ,Il y a deux paramètres, L'un est une augmentation linéaire LINEAR, L'un est la croissance exponentielle EXPONENTIAL. Impossible de définir un temps fixe à chaque fois . Si vous utilisez retry , Doit être défini dans WorkerRetour àResult.retry(),Impossible de revenirResult.success().Voici les codes de référence:

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setBackoffCriteria(
       BackoffPolicy.LINEAR,
       OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
       TimeUnit.MILLISECONDS)
   .build()

Huit、Identification du travail

Voir le site officiel ci - dessous :

Chaque demande de travail peut être configurée avec un Identificateur unique, Cet identificateur peut être utilisé pour identifier le travail plus tard ,Pour queAnnulation Travailler ou Observer ses progrès .

S'il y a un groupe de travail logiquement pertinent,Il peut également être utile de marquer ces éléments de travail.Par marquage, Vous travaillez ensemble sur un ensemble de demandes de travail .

Par exemple,WorkManager.cancelAllWorkByTag(String) Toutes les demandes d'emploi avec une étiquette spécifique seront annulées ,WorkManager.getWorkInfosByTag(String)Renvoie un WorkInfo Liste des objets, Cette liste peut être utilisée pour déterminer l'état de fonctionnement actuel .

Le code suivant montre comment ajouter “cleanup”Marquage:

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .addTag("cleanup")
   .build()

Enfin, Vous pouvez ajouter plusieurs balises à une seule demande de travail . Ces étiquettes sont stockées en interne sous la forme d'un ensemble de chaînes .Vous pouvez utiliser WorkInfo.getTags() Accès et WorkRequest Ensemble de balises associées .

De Worker Dans la classe,Vous pouvez passer par ListenableWorker.getTags() Récupérer son ensemble de balises .

Neuf、Paramètres de passage

Certains travaux nécessitent un certain nombre de paramètres .Vous pouvez utiliser les méthodes suivantes, Voici un exemple de code::


// Define the Worker requiring input
class UploadWork(appContext: Context, workerParams: WorkerParameters)
   : Worker(appContext, workerParams) {
    

   override fun doWork(): Result {
    
       val imageUriInput =
           inputData.getString("IMAGE_URI") ?: return Result.failure()

       uploadFile(imageUriInput)
       return Result.success()
   }
   ...
}

// Create a WorkRequest for your Worker and sending it input
val myUploadWork = OneTimeWorkRequestBuilder<UploadWork>()
   .setInputData(workDataOf(
       "IMAGE_URI" to "http://..."
   ))
   .build()

Dix、Tâche urgente

Selon le site officiel, les tâches urgentes sont celles qui doivent être exécutées immédiatement , Comme ajouter un abonnement ,Payer les factures,Envoyer un message. Mais les premiers contacts , Aucune différence par rapport aux autres tâches .C'est peut - êtreWorkManager Il y a beaucoup de missions , Il en résulte une file d'attente de tâches , Les tâches accélérées peuvent être insérées devant l'équipe pour accélérer l'exécution .

La Mission d'urgence est WorkManager2.7Ajouté quand.Et peut - être dansAndroid12 Exécuter le Service de réception sur les versions précédentes . Donc, dans une certaine mesure, limiter son utilisation des scénarios .

Voici les citations

In Android 12 Avant, Dans l'atelier getForegroundInfoAsync() Et getForegroundInfo() La méthode permet WorkManager Avant que vous appeliez setExpedited() Afficher les notifications .

Si vous souhaitez demander une tâche à exécuter en tant que tâche urgente ,Alors tout ListenableWorker Doit être réalisé getForegroundInfo Méthodes.

Attention!: Si le getForegroundInfo Méthodes, Alors appelez sur l'ancienne plateforme setExpedited Heure, Peut causer un crash d'exécution .

Par Android 12 Ou plus tard lorsque la plate - forme cible est , Le Service de réception est toujours disponible via setForeground Utilisation de la méthode.

Attention!setForeground() Peut - être dans Android 12 Lancer une exception d'exécution sur ,Et dans Démarrage limité Peut lancer une exception .

L'appareil de travail

Le travailleur ne sait pas si le travail qu'il effectue a été accéléré .Mais,Dans certaines versions Android Allez.,Si WorkRequest C'est urgent. , Le travailleur peut afficher des notifications .

À cette fin,,WorkManager Offre getForegroundInfoAsync() Méthodes, Vous devez mettre en œuvre cette méthode ,Jean WorkManager Afficher les notifications si nécessaire ,Pour démarrer ForegroundService.

CoroutineWorker

Si vous utilisez CoroutineWorker,Doit être réalisé getForegroundInfo().Et puis,In doWork() Passer à l'intérieur setForeground(). Ce faisant, il Android 12 Créer des notifications dans les versions précédentes .

Voir l'exemple suivant:

  class ExpeditedWorker(appContext: Context, workerParams: WorkerParameters):   CoroutineWorker(appContext, workerParams) {   override suspend fun getForegroundInfo(): ForegroundInfo {       return ForegroundInfo(           NOTIFICATION_ID, createNotification()       )   }   override suspend fun doWork(): Result {       TODO()   }    private fun createNotification() : Notification {       TODO()    }}

Attention!:Vous devriez setForeground() Encapsulé dans try/catch En bloc, Pour capturer les IllegalStateException. Si votre application ne fonctionne pas au premier plan pour le moment , Ce genre d'exception peut se produire .In Android 12 Et plus, Vous pouvez utiliser plus de détails ForegroundServiceStartNotAllowedException.

Politique des quotas

Vous pouvez contrôler ce qui se passe lorsque l'application atteint son quota d'exécution . Pour continuer ,Vous pouvez passer setExpedited()

  • OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST, Cela fait que le travail fonctionne comme une demande de travail normale . Le fragment de code ci - dessus illustre cette opération .
  • OutOfQuotaPolicy.DROP_WORK_REQUEST, Cela peut entraîner une demande d'annulation si le quota est insuffisant .

Exemple d'application

Pour en savoir plus WorkManager 2.7.0 Exemple complet de la façon d'utiliser le travail accéléré ,Veuillez vérifier GitHub Oui. WorkManagerSample.

Retarder le travail accéléré

Le système tentera de , Faites le travail dès que possible .Mais, Comme pour les autres types d'emplois , Le système peut retarder le démarrage de nouveaux travaux accélérés , Si :

  • Charge:Système surchargé, Lorsque trop de tâches sont déjà en cours d'exécution ou lorsque le système est hors de mémoire ,Ça arrive..
  • Quotas: Dépassement de la limite de quota de travail accéléré . Le travail accéléré utilise un système de quotas basé sur l'application de partitions de stockage en attente , Et limite le temps d'exécution maximum dans la fenêtre de défilement . Les quotas utilisés pour les travaux accélérés sont plus restrictifs que ceux utilisés pour d'autres types de travaux d'arrière - plan .

Il est important de noter que, Hérité de WorkCatégorie,- Oui.ListenableWorkerSous - classe, Il faut quand même réécrire getForegroundInfoAsync()Fonctions.

Onze、Liens de référence

  1. WorkManager Démarrer avec  |  Android Développeurs  |  Android Developers

  2. Architecture des applications:Couche de données - Utiliser WorkManager Programmer les tâches - Android Développeurs  |  Android Developers

原网站

版权声明
本文为[M. Tony.]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050949393689.html