当前位置:网站首页>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
边栏推荐
- Kotlin compose and native nesting
- What is the origin of the domain knowledge network that drives the new idea of manufacturing industry upgrading?
- uniapp + uniCloud+unipay 实现微信小程序支付功能
- Unity particle special effects series - the poison spray preform is ready, and the unitypackage package can be used directly - next
- How to get the STW (pause) time of GC (garbage collector)?
- Those who are good at using soldiers, hide in the invisible, and explain the best promotional value works in depth in 90 minutes
- Comment obtenir le temps STW du GC (collecteur d'ordures)?
- 面试:Bitmap像素内存分配在堆内存还是在native中
- Swift set pickerview to white on black background
- Swift uses userdefaults and codable to save an array of class objects or structure instances
猜你喜欢
@Serializedname annotation use
Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 -下
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)
字节跳动面试官:一张图片占据的内存大小是如何计算
RMS to EAP is simply implemented through mqtt
Kotlin compose and native nesting
.Net之延迟队列
Six simple cases of QT
如何写出高质量的代码?
随机推荐
学习笔记5--高精地图解决方案
How to get the STW (pause) time of GC (garbage collector)?
CSDN always jumps to other positions when editing articles_ CSDN sends articles without moving the mouse
面试:List 如何根据对象的属性去重?
Constrained layout flow
善用兵者,藏于无形,90 分钟深度讲解最佳推广价值作品
小程序中自定义行内左滑按钮,类似于qq和wx消息界面那种
leetcode:1200. 最小绝对差
【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
Energy momentum: how to achieve carbon neutralization in the power industry?
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 -下
程序员搞开源,读什么书最合适?
The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
如何写出高质量的代码?
MySQL digital type learning notes
Mysql80 service does not start
> Could not create task ‘:app:MyTest. main()‘. > SourceSet with name ‘main‘ not found. Problem repair
Wechat applet - simple diet recommendation (3)
Wechat applet - simple diet recommendation (4)