工人经理:不在队列中开始工作

Mhe*_*rsh 6 android kotlin android-workmanager

我有这样的代码,我需要实现任务队列,如果任务在队列中,那么你不需要添加它。\n我实现如图所示,一切正常,但有时工作人员的状态保持ENQUEUED ,并且新的任务不会添加到队列中。\n也就是说,当没有互联网时,我添加一个任务,当互联网出现时,任务开始耗尽,但由于某些原因,有时不会\xe2\x80\ x99t 发生,我无法\xe2\x80\x99 理解为什么任务没有启动,尽管事实上有互联网并且任务在队列中。\n你如何确定为什么任务不会启动?\n有人知道吗?有更好的建议吗?

\n\n
//run task\nrunOneTimeWorkByType<GetDocumentsWorker>(GET_DOCUMENTS_TAG)\n\n     private inline fun <reified W : Worker> runOneTimeWorkByType(tag: String) {\n            val workerInfoList = workManager\n                .getWorkInfosByTag(tag)\n                .get()\n\n            for (item in workerInfoList) {\n                if (item.state == WorkInfo.State.ENQUEUED){\n                    return\n                }\n            }\n\n            val constraints = Constraints.Builder()\n                .setRequiredNetworkType(NetworkType.CONNECTED)\n                .build()\n\n            val workRequest =\n                OneTimeWorkRequestBuilder<W>()\n                    .setConstraints(constraints)\n                    .addTag(tag)\n                    .build()\n\n            workManager.enqueue(workRequest)\n        }\n\n\n        class GetDocumentsWorker(ctx: Context, workerParams: WorkerParameters) :\n            Worker(ctx, workerParams) {\n            @Inject\n            lateinit var serviceUtils: ServiceUtils\n\n            init {\n                App.appComponent.inject(this)\n            }\n\n            override fun doWork(): Result {\n                Log.d("workmng", "GetDocumentsWorker: start")\n                try {\n                    serviceUtils.documentsGet()\n                } catch (e: Exception) {\n                    Log.d("workmng", "GetDocumentsWorker:  exception", e.cause)\n                    return Result.retry()\n                }\n                Log.d("workmng", "GetDocumentsWorker: end")\n                return Result.success()\n            }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:

\n\n

我尝试无条件启动任务,但在这种情况下,也没有任何启动,有想法为什么会这样?

\n\n
fun runGetDocumentsTask() {\n        val workRequest =\n            OneTimeWorkRequestBuilder<GetDocumentsWorker>()\n                .addTag(GET_DOCUMENTS_TAG)\n                .build()\n\n        workManager.enqueue(workRequest)\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我取消工作时,一切开始正常工作:workManager.cancelAllWork()

\n\n

创建worker时,我运行了几个周期性任务,它们会出现问题吗?如果是这样,如何解决?

\n\n
private var workManager: WorkManager = WorkManager.getInstance(ctx)\n\n    init {\n        //workManager.cancelAllWork()\n        runSendAllPeriodicTasks()\n    }\n\n    private fun runSendAllPeriodicTasks() {\n        runOneTimeWorkOnPeriod<SendAllWorker>(15, TimeUnit.MINUTES)\n        runOneTimeWorkOnPeriod<FailureFilesResendWorker>(3, TimeUnit.HOURS)\n        runOneTimeWorkOnPeriod<GetItemsWorker>(1, TimeUnit.HOURS)\n    }\n
Run Code Online (Sandbox Code Playgroud)\n