当前位置:网站首页>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
边栏推荐
- 程序员搞开源,读什么书最合适?
- B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条...
- @JsonAdapter注解使用
- C#函数返回多个值方法
- Wechat applet - simple diet recommendation (4)
- .Net之延迟队列
- Redis如何实现多可用区?
- Swift tableview style (I) system basic
- What is the origin of the domain knowledge network that drives the new idea of manufacturing industry upgrading?
- The most complete is an I2C summary
猜你喜欢
[C language] the use of dynamic memory development "malloc"
View Slide
@SerializedName注解使用
Energy momentum: how to achieve carbon neutralization in the power industry?
Cut off 20% of Imagenet data volume, and the performance of the model will not decline! Meta Stanford et al. Proposed a new method, using knowledge distillation to slim down the data set
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
The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
Swift set pickerview to white on black background
苹果 5G 芯片研发失败?想要摆脱高通为时过早
Unity particle special effects series - the poison spray preform is ready, and the unitypackage package is directly used - on
随机推荐
The most complete is an I2C summary
ByteDance Interviewer: how to calculate the memory size occupied by a picture
ConstraintLayout官方提供圆角ImageFilterView
Tianlong Babu TLBB series - about items dropped from packages
【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
What is the origin of the domain knowledge network that drives the new idea of manufacturing industry upgrading?
Dedecms website building tutorial
Node red series (29): use slider and chart nodes to realize double broken line time series diagram
面试:List 如何根据对象的属性去重?
Swift tableview style (I) system basic
Energy momentum: how to achieve carbon neutralization in the power industry?
《剑来》语句摘录(七)
学习笔记6--卫星定位技术(上)
硬核,你见过机器人玩“密室逃脱”吗?(附代码)
到底谁才是“良心”国产品牌?
Using directive in angualr2 to realize that the picture size changes with the window size
.Net之延迟队列
Six simple cases of QT
MySQL digital type learning notes
双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)