当前位置:网站首页>Workmanager Learning one
Workmanager Learning one
2022-07-05 10:16:00 【M. Tony.】
Catalogue des articles
Un.、Préface
À l'heure actuelle, dans le cadre d'une longue mission d'arrière - plan,Officiellement recommandéWorkManager
Pour gérer les tâches de fond,C'est ça.WorkManager
Faites un simple enregistrement.WorkManager
Les tâches suivantes peuvent être exécutées principalement
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 àWorkManager
Exé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 WorkRequest
De 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)
}
UtiliserWorkManager
Exé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)
).BatteryNotLow Si défini à true,Alors quand l'appareil est dans“Mode faible puissance”Heure,Le travail ne fonctionne pas. RequiresCharging Si défini à true,Alors le travail ne peut fonctionner que lorsque l'appareil est chargé. DeviceIdle Si 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 . StorageNotLow Si 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éationConstraints
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 Worker
Retour à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.7
Ajouté 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()
EtgetForegroundInfo()
La méthode permet WorkManager Avant que vous appeliezsetExpedited()
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 plateformesetExpedited
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émarrerForegroundService
.CoroutineWorker
Si vous utilisez
CoroutineWorker
,Doit être réaliségetForegroundInfo()
.Et puis,IndoWork()
Passer à l'intérieursetForeground()
. 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é danstry/catch
En bloc, Pour capturer lesIllegalStateException
. 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étailsForegroundServiceStartNotAllowedException
.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 Work
Catégorie,- Oui.ListenableWorker
Sous - classe, Il faut quand même réécrire getForegroundInfoAsync()
Fonctions.
Onze、Liens de référence
边栏推荐
- Interview: how does the list duplicate according to the attributes of the object?
- Events and bubbles in the applet of "wechat applet - Basics"
- Excerpt from "sword comes" (VII)
- Swift set pickerview to white on black background
- How to judge that the thread pool has completed all tasks?
- La vue latérale du cycle affiche cinq demi - écrans en dessous de cinq distributions moyennes
- QT event filter simple case
- 面试:List 如何根据对象的属性去重?
- 能源势动:电力行业的碳中和该如何实现?
- 善用兵者,藏于无形,90 分钟深度讲解最佳推广价值作品
猜你喜欢
Kotlin compose and native nesting
What is the most suitable book for programmers to engage in open source?
Meitu lost 300 million yuan in currency speculation for half a year. Huawei was exposed to expand its enrollment in Russia. Alphago's peers have made another breakthrough in chess. Today, more big new
驱动制造业产业升级新思路的领域知识网络,什么来头?
Design of stepping motor controller based on single chip microcomputer (forward rotation and reverse rotation indicator gear)
.Net之延迟队列
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
宝塔面板MySQL无法启动
学习笔记6--卫星定位技术(上)
到底谁才是“良心”国产品牌?
随机推荐
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
如何写出高质量的代码?
TypeError: Cannot read properties of undefined (reading ‘cancelToken‘)
Constrained layout flow
天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
Uni app running to wechat development tool cannot Preview
IDEA新建sprintboot项目
vscode的快捷键
leetcode:1200. 最小绝对差
oracle和mysql批量Merge对比
【小技巧】獲取matlab中cdfplot函數的x軸,y軸的數值
MySQL digital type learning notes
Node red series (29): use slider and chart nodes to realize double broken line time series diagram
.Net之延迟队列
Wechat applet - simple diet recommendation (4)
What is the most suitable book for programmers to engage in open source?
到底谁才是“良心”国产品牌?
[C language] the use of dynamic memory development "malloc"
Dedecms website building tutorial
小程序中自定义行内左滑按钮,类似于qq和wx消息界面那种