Android PeriodicWorkRequest创建后是否会立即执行?
编辑(简版)
我之前不知道PeriodicWorkRequest存在多个构造函数,高赞回答的评论点醒了我困惑的原因。
背景
我在调度任务时需要解决几个特殊场景,其中一个场景要求先立即执行任务,再创建周期性任务请求。我在Android的PeriodicWorkRequest官方文档中看到如下描述:
该任务会多次执行直到被取消,首次执行会立即触发,或在满足指定Constraints后尽快触发。
我原本以为这意味着创建请求后任务就会立即执行,但我自己的测试实现结果并非如此。(虽然本次测试的任务不需要CoroutineWorker和网络连接限制,但这两个配置符合我的业务需求,所以我仍然加入了测试)
启动Worker代码
object WorkerManager { private val TAG = "WORKER_MANAGER_TEST" fun buildWorkRequest( startingNumber: Int, context: Context ) { val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() val workRequest = PeriodicWorkRequest.Builder( PeriodicWorker::class.java, 1, TimeUnit.HOURS, 15, TimeUnit.MINUTES ) .setInputData( workDataOf(Constants.INPUT_DATA_NUMBER to startingNumber) ) .addTag(Constants.PERIODIC_WORKER_TAG) .setConstraints(constraints) .build() WorkManager.getInstance(context).enqueueUniquePeriodicWork( Constants.PERIODIC_WORKER_NAME, ExistingPeriodicWorkPolicy.REPLACE, workRequest ) Log.d(TAG, "Worker started. Starting number: $startingNumber") } }
Worker实现代码
class PeriodicWorker(context: Context, workerParams: WorkerParameters): CoroutineWorker(context, workerParams ) { companion object { var isInit = false var count: Int = 1 } override suspend fun doWork(): Result = try { if (!isInit) { count = inputData.getInt(Constants.INPUT_DATA_NUMBER, Constants.DEFAULT_DATA_NUMBER) isInit = true } else { count += 1 } Repository.updateNumber(count) Result.success() } catch (exception: Exception) { Result.failure() } }
仓库层代码
object Repository { private val TAG = "REPOSITORY_TAG" private val _number = MutableStateFlow(0) val number: StateFlow<Int> = _number suspend fun updateNumber(number: Int) { Log.d(TAG, "Number updated to: $number") _number.emit(number) } }
ViewModel代码
class NumberViewModel : ViewModel() { private val _count = MutableLiveData(0) val count: LiveData<Int> = _count init { viewModelScope.launch { Repository.number.collect { _count.postValue(it) } } } }
测试结果
我以10作为起始数值启动了worker。
日志如下:
8:45am - Worker started. Starting number: 10 9:37am - Number updated to: 10 // work executed 10:37am - Number updated to: 11 // work executed 11:37am - Number updated to: 12 // work executed
设备信息
系统版本28 -- 三星SM-T390
我的结论
- 限制条件(Constraints):不可能是问题原因,测试全程我设备都有网络连接,而这是唯一指定的限制条件。
- 电池优化:我可以确认测试前该应用已经加入了电池优化白名单。
因此我得出结论:PeriodicWorkRequests 不会立即执行任务。Android官方文档的描述应该修改为:
该任务会多次执行直到被取消,首个周期会立即开始,首次任务执行会在满足限制条件的前提下,在第一个flex间隔内触发。
问题
我的结论是否合理?有没有我没考虑到的影响因素?
内容的提问来源于stack exchange,提问作者Lucas Kivi
相关产品推荐
相关产品推荐

