【发布时间】:2020-05-15 03:34:53
【问题描述】:
我一直在检查其他链接,stackoverflow 以减少工作管理器的时间段,但我发现下面的链接
How to reduce time of PeriodicWorkManager in WorkManager
上面的链接说最短时间是 15 分钟。
需要立即将数据从移动设备发送到服务器。 有没有办法缩短时间?
请帮助我。在此先感谢。
【问题讨论】:
标签: android android-workmanager
我一直在检查其他链接,stackoverflow 以减少工作管理器的时间段,但我发现下面的链接
How to reduce time of PeriodicWorkManager in WorkManager
上面的链接说最短时间是 15 分钟。
需要立即将数据从移动设备发送到服务器。 有没有办法缩短时间?
请帮助我。在此先感谢。
【问题讨论】:
标签: android android-workmanager
您可以将Worker 设为OneTimeWorkRequest,并在dowWork() 关闭(读取返回)之前,使其再次注册。
这将是这样的:
val tenMinuteRequest = OneTimeWorkRequestBuilder<YourWorker>()
.setInitialDelay(10, TimeUnit.MINUTES)
.build()
WorkManager.getInstance(applicationContext)
.enqueue(tenMinuteRequest)
//return Result.Success here or whatever
当你从另一个类中解雇这个 Worker 时,它会 do 它的 work 并在之后重新安排自己,然后循环到这里。
【讨论】:
我设法做的是一种 hack。我从doWork() 递归调用了一个方法。然后每次检查时间差,使递归在15分钟前停止。
override suspend fun doWork(): Result {
startTime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())
doSomeWork()
return Result.success()
}
private suspend fun doSomeWork() {
Log.d("SomeWorker", "-------> working")
val currentTime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())
val diff = currentTime - startTime
if (diff < 12L) {
Thread.sleep(30000) // this is the new time interval
doSomeWork()
}
}
这是完整的工人阶级: https://gist.github.com/WSAyan/7f3a75d05332984e24ad5418f0b1e38b
【讨论】:
在work manager中,两个周期性请求之间的最小时间间隔为15 minutes。
阅读此文档:https://developer.android.com/reference/kotlin/androidx/work/PeriodicWorkRequest
你不能在work manager中减少它。
如果您想在这种情况下减少时间,您需要使用JobScheduler,它会提供具有特定时间间隔的选项来执行您的请求。
https://developer.android.com/reference/android/app/job/JobScheduler
【讨论】:
如果需要即时发送,可以试试OneTimeWorkRequest。
虽然它的执行也将取决于您添加的约束或其他一些情况,但大多数时候它会在您调用它之后立即开始。
编辑:
如果你想要这个periodically,你可以创建一个PeriodicWorkRequest并在其中启动你的OneTimeWorkRequest。
例如。假设您有两种方法,
startOneTimeWorker(), startPeriodicWorker()
如果您想立即同步一次,OneTimeWorker 将完成这项工作。
但是,如果您想立即同步然后也安排它,请致电startOneTimeWorker(),然后致电startPeriodicWorker()。定期工作人员将在其中调用 startOneTimeWorker() doWork()
所以第一次会立即调用OneTimeWorkRequest,然后按照PeriodicTimeWorkRequest的时间表调用。
OneTimeWorkRequest
PeriodicWorkRequest,在里面调用OneTimeWorkRequest
【讨论】:
如果您想一次性将数据从 Mobile 立即发送到服务器,请使用 OneTimeWorkRequestBuilder ,否则使用 ForeGround Service 而不是 WorkManager 将连续数据上传到服务器。
这两种策略都将确保数据在服务器端上传。如果是繁重的上传工作,可能需要超过 10 分钟,请务必使用 ForeGround Service。
【讨论】: