当前位置:网站首页>Workmanager learning 1
Workmanager learning 1
2022-07-05 10:16:00 【Mr_ Tony】
List of articles
One 、 Preface
At present, when performing long-term background tasks , Official recommendation WorkManager
To handle background tasks , Here to WorkManager
Make a simple record .WorkManager
It can mainly perform the following tasks
Two 、 Add dependency
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"
}
3、 ... and 、 A simple example
One WorkManager
It needs three parts . Define a Work
, Create a WorkRequest
, Submit to WorkManager
To perform . Here is an example of a simple one-time task .
WorkTest.kt
class WorkTest(val appContext: Context, workerParams: WorkerParameters): Worker(appContext, workerParams) {
override fun doWork(): Result {
Log.e("YM--->"," Background task execution in progress , Task thread :${
Thread.currentThread().id}--> Thread name :${
Thread.currentThread().name}")
return Result.success()
}
}
Here are two kinds of creation WorkRequest
The way , A complex kind of , A simple , Choose an implementation according to the situation .
private fun initWork() {
// val uploadWorkRequest: WorkRequest = // Complex builder approach
// OneTimeWorkRequestBuilder<WorkTest>()
// .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)// Set urgent tasks
// .build()
val uploadWorkRequest: WorkRequest = OneTimeWorkRequest.from(WorkTest::class.java)// Simple way
WorkManager
.getInstance(this)
.enqueue(periodicWorkRequest)
}
Use WorkManager
To perform
WorkManager
.getInstance(this)
.enqueue(periodicWorkRequest)
Four 、 Regular tasks
A regular task can execute a task many times . The following is how to create
val saveRequest =
PeriodicWorkRequestBuilder<WorkTest>(1, TimeUnit.HOURS)
// Additional configuration
.build()
Need to pay attention to the time , If the time is less than 15 minute , It will be calculated according to 15 minutes , If it is more than 15 minutes, it will be calculated according to the actual time .
Suppose you want to define a flexible time period , For example, the last 15 minutes to perform the task , You can use the following
val myUploadWork = PeriodicWorkRequestBuilder<SaveImageToFileWorker>(
1, TimeUnit.HOURS, // repeatInterval (the period cycle)
15, TimeUnit.MINUTES) // flexInterval
.build()
Creating PeriodicWorkRequest
Time transfer flexInterval
as well as repeatInterval
. Flexible time period from repeatInterval - flexInterval
Start , Until the end of the interval .
The recurrence interval must be greater than or equal to PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, The flexible interval must be greater than or equal to PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS.
5、 ... and 、 Work constraints
Here refer to the official website :
constraint This ensures that work is delayed until the best conditions are met . The following constraints apply to WorkManager.
NetworkType Constrains the amount of time required to run the work Network type . for example Wi-Fi ( [UNMETERED](https://developer.android.google.cn/reference/androidx/work/NetworkType?hl=zh-cn#UNMETERED)
).BatteryNotLow If set to true, So when the device is in “ Low power mode ” when , Work doesn't work . RequiresCharging If set to true, So the work can only run when the device is charging . DeviceIdle If set to true, The user's equipment must be idle , To run the work . When running batch operations , This constraint can be very useful ; If you don't use this constraint , Batch operations may degrade the performance of other applications that are actively running on the user's device . StorageNotLow If set to true, So when the storage space on the user's device is insufficient , Work doesn't work . To create a set of constraints and associate them with a work , Please use one
Contraints.Builder()
establishConstraints
example , And assign the instance toWorkRequest.Builder()
.for example , The following code builds a work request , This work request is only available when the user's device is charging and connected to Wi-Fi It only runs when the network is running :
val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresCharging(true) .build() val myWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<MyWork>() .setConstraints(constraints) .build()
If more than one constraint is specified , Work will only run if all constraints are met .
If a constraint is no longer satisfied while the work is running ,WorkManager Will stop the actuator . The system will retry the work after all constraints are met .
6、 ... and 、 Delay work
The above tasks will be executed immediately by default , If you want to delay the execution, you can take the following measures :
val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
.setInitialDelay(10, TimeUnit.MINUTES)
.build()
It should be noted that scheduled tasks , Only the first time will be delayed .
7、 ... and 、 Retry and retry policy
If the task fails , Want to retry , You can use this method . Retry has two parameters : Retry time and retry policy . Retry time refers to the waiting time before each retry , The shortest 10s perhaps MIN_BACKOFF_MILLIS. The retry strategy refers to how the subsequent retry time increases , There are two parameters , One is linear growth LINEAR, One is exponential growth EXPONENTIAL. You cannot set a fixed time each time . If you use retry , Need to define Worker
When to return Result.retry()
, Can't return Result.success()
. Here is the reference code :
val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.build()
8、 ... and 、 Job identification
Please refer to the official website :
One can be set for each work request Unique identifier , This identifier can be used to identify the job later , In order to Cancel Work or Observe its progress .
If there's a set of logically relevant work , Tagging these work items can also be helpful . By marking , You work together on a set of work requests .
for example ,WorkManager.cancelAllWorkByTag(String) All work requests with a specific tag will be cancelled ,WorkManager.getWorkInfosByTag(String) Will return a WorkInfo The object list , This list can be used to determine the current working state .
The following code shows how to add “cleanup” Mark :
val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>() .addTag("cleanup") .build()
Last , You can add multiple tags to a single work request . These tags are stored internally as a set of strings . You can use WorkInfo.getTags() To obtain and
WorkRequest
Associated tag set .from
Worker
Class , You can ListenableWorker.getTags() Retrieve its tag set .
Nine 、 Pass parameters
Some jobs need to pass some parameters . You can use the following methods , The sample code is as follows :
// 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()
Ten 、 Urgent task
According to the official website, urgent tasks are those that need to be executed immediately , For example, add a subscription , Pay bills , Send a message . But initial contact , There is no difference from other tasks . May be in WorkManager
There are many tasks , It will cause tasks to queue , Urgent tasks can be inserted in front of the team to speed up the implementation .
The urgent task is to WorkManager2.7
Added when . And maybe in Android12 The foreground service runs on previous versions . Therefore, its use scenarios are limited to a certain extent .
Here are the references
stay Android 12 Before , In the working device
getForegroundInfoAsync()
andgetForegroundInfo()
Method can make WorkManager Before you callsetExpedited()
Display notification when .If you want to request a task to run as an urgent job , Then all of them ListenableWorker All must be realized
getForegroundInfo
Method .Be careful : If the corresponding
getForegroundInfo
Method , Then call on the old platformsetExpedited
when , May cause runtime crash .With Android 12 Or higher version as the target platform , The front desk service can still pass the corresponding
setForeground
Methods use .Be careful :
setForeground()
May be in Android 12 Throw a runtime exception on , And in Startup is restricted An exception may be thrown .Working device
The working device does not know whether the work it performs has been expedited . however , In some versions of Android On , If
WorkRequest
Be expedited , The worker can display notifications .So ,WorkManager Provides
getForegroundInfoAsync()
Method , You must implement this method , Give Way WorkManager Display notifications when necessary , To startForegroundService
.CoroutineWorker
If you use
CoroutineWorker
, You have to achievegetForegroundInfo()
. then , staydoWork()
Pass it tosetForeground()
. Doing so will result in Android 12 Create notifications in previous versions .Please refer to the following example :
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() }}
Be careful : You should
setForeground()
Packaged intry/catch
In block , To capture possibleIllegalStateException
. If your application cannot run in the foreground at this time , Such exceptions may occur . stay Android 12 And later , You can use more detailedForegroundServiceStartNotAllowedException
.Quota policy
You can control what happens when the application reaches its execution quota . To continue , You can deliver
setExpedited()
:
OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST
, This causes the job to run as a normal work request . The above code snippet demonstrates this operation .OutOfQuotaPolicy.DROP_WORK_REQUEST
, This will cause the request to be cancelled when the quota is insufficient .The sample application
To see about WorkManager 2.7.0 A complete example of how to use urgent work , Please check out GitHub Upper WorkManagerSample.
Delay urgent work
The system will try to call the specified urgent job , Execute the job as soon as possible . however , Like other types of jobs , The system may delay starting new expediting work , In the following cases :
- load : The system load is too high , When there are too many jobs already running or when the system is out of memory , That's what happens .
- The quota : The expediting quota limit has been exceeded . The urgent work uses the quota system based on the application standby storage partition , And limit the maximum execution time in the scrolling time window . Quotas for expedited work are more restrictive than those for other types of background jobs .
It should be noted that , Inherited above Work
class , yes ListenableWorker
Subclasses of , So still rewrite getForegroundInfoAsync()
function .
11、 ... and 、 Reference link
边栏推荐
- Swift set pickerview to white on black background
- 驱动制造业产业升级新思路的领域知识网络,什么来头?
- 天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
- A large number of virtual anchors in station B were collectively forced to refund: revenue evaporated, but they still owe station B; Jobs was posthumously awarded the U.S. presidential medal of freedo
- isEmpty 和 isBlank 的用法区别
- 高级 OpenCV:BGR 像素强度图
- The most complete is an I2C summary
- 如何写出高质量的代码?
- The horizontally scrolling recycleview displays five and a half on one screen, lower than the average distribution of five
- Uni app running to wechat development tool cannot Preview
猜你喜欢
历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
学习笔记4--高精度地图关键技术(下)
善用兵者,藏于无形,90 分钟深度讲解最佳推广价值作品
驱动制造业产业升级新思路的领域知识网络,什么来头?
Constraintlayout officially provides rounded imagefilterview
【系统设计】指标监控和告警系统
ConstraintLayout的流式布局Flow
【 conseils 】 obtenir les valeurs des axes X et y de la fonction cdfplot dans MATLAB
Have you learned to make money in Dingding, enterprise micro and Feishu?
Design and Simulation of fuzzy PID control system for liquid level of double tank (matlab/simulink)
随机推荐
@Jsonadapter annotation usage
Glide advanced level
《微信小程序-基础篇》小程序中的事件与冒泡
RMS to EAP is simply implemented through mqtt
ConstraintLayout官方提供圆角ImageFilterView
Tianlong Babu TLBB series - single skill group injury
Pagoda panel MySQL cannot be started
一种用于干式脑电图的高密度256通道电极帽
The horizontally scrolling recycleview displays five and a half on one screen, lower than the average distribution of five
如何判断线程池已经执行完所有任务了?
程序员如何活成自己喜欢的模样?
官网给的这个依赖是不是应该为flink-sql-connector-mysql-cdc啊,加了依赖调
面试:List 如何根据对象的属性去重?
能源势动:电力行业的碳中和该如何实现?
Swift tableview style (I) system basic
小程序中自定义行内左滑按钮,类似于qq和wx消息界面那种
Energy momentum: how to achieve carbon neutralization in the power industry?
pytorch输出tensor张量时有省略号的解决方案(将tensor完整输出)
Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 -下
Openes version query