Android 工作人员管理器:不在排队中开始工作
我有这样的代码,我需要实现任务队列,如果任务在队列中,那么您不需要添加它。 我实现了如所示的when,一切正常,但有时工作者的状态保持排队状态,并且新任务不会添加到队列中。 也就是说,当没有Internet时,我添加一个任务,当Internet出现时,任务开始用尽,但由于某种原因,有时它不会发生,我不理解为什么任务不启动,尽管Internet在那里,任务在队列中。 如何确定任务为何无法启动? 有人有更好的建议吗Android 工作人员管理器:不在排队中开始工作,android,kotlin,android-workmanager,Android,Kotlin,Android Workmanager,我有这样的代码,我需要实现任务队列,如果任务在队列中,那么您不需要添加它。 我实现了如所示的when,一切正常,但有时工作者的状态保持排队状态,并且新任务不会添加到队列中。 也就是说,当没有Internet时,我添加一个任务,当Internet出现时,任务开始用尽,但由于某种原因,有时它不会发生,我不理解为什么任务不启动,尽管Internet在那里,任务在队列中。 如何确定任务为何无法启动? 有人有更好的建议吗 //run task runOneTimeWorkByType<GetDocu
//run task
runOneTimeWorkByType<GetDocumentsWorker>(GET_DOCUMENTS_TAG)
private inline fun <reified W : Worker> runOneTimeWorkByType(tag: String) {
val workerInfoList = workManager
.getWorkInfosByTag(tag)
.get()
for (item in workerInfoList) {
if (item.state == WorkInfo.State.ENQUEUED){
return
}
}
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val workRequest =
OneTimeWorkRequestBuilder<W>()
.setConstraints(constraints)
.addTag(tag)
.build()
workManager.enqueue(workRequest)
}
class GetDocumentsWorker(ctx: Context, workerParams: WorkerParameters) :
Worker(ctx, workerParams) {
@Inject
lateinit var serviceUtils: ServiceUtils
init {
App.appComponent.inject(this)
}
override fun doWork(): Result {
Log.d("workmng", "GetDocumentsWorker: start")
try {
serviceUtils.documentsGet()
} catch (e: Exception) {
Log.d("workmng", "GetDocumentsWorker: exception", e.cause)
return Result.retry()
}
Log.d("workmng", "GetDocumentsWorker: end")
return Result.success()
}
}
fun runGetDocumentsTask() {
val workRequest =
OneTimeWorkRequestBuilder<GetDocumentsWorker>()
.addTag(GET_DOCUMENTS_TAG)
.build()
workManager.enqueue(workRequest)
}
private var workManager: WorkManager = WorkManager.getInstance(ctx)
init {
//workManager.cancelAllWork()
runSendAllPeriodicTasks()
}
private fun runSendAllPeriodicTasks() {
runOneTimeWorkOnPeriod<SendAllWorker>(15, TimeUnit.MINUTES)
runOneTimeWorkOnPeriod<FailureFilesResendWorker>(3, TimeUnit.HOURS)
runOneTimeWorkOnPeriod<GetItemsWorker>(1, TimeUnit.HOURS)
}