Android Work Manager- Work Manager是否能确保后台执行100%完成?

7
从我阅读的文档中https://developer.android.com/topic/libraries/architecture/workmanager得知:
它说:
无论您的应用程序是否被强制退出或设备被重新启动,任务仍然保证运行。
这意味着,后台执行的任务将会被执行直到完成,不受任何影响?
例如:
一个应用程序有一个按钮,执行工作管理器实现上传数据到在线数据库,但需要互联网连接才能上传数据。因此,我的应用当前处于离线模式并且我点击了该按钮。
我的疑问是:
即使没有互联网连接,工作管理器是否会在后台运行进程并不断重试该进程?只有在有互联网连接并完成数据上传后,才会停止该进程?
2个回答

10
工作管理器会在后台运行进程,并且即使没有网络连接也会不断重试该进程,只有在有网络连接并完成数据上传后才会完成和停止该进程。它不会隐式地尝试连续执行工作,并仅在成功时停止。它将取决于doWork()或您的Worker返回的结果。如果返回RETRY,则将使用WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, long, TimeUnit)中指定的退避策略进行重试。
但是,如果需要在有网络连接时执行某些操作,则可以指定适当的约束条件。对于网络连接性,您可以设置如下约束条件:
Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();

 OneTimeWorkRequest mywork=
            new OneTimeWorkRequest.Builder(MyWorker.class)
 .setConstraints(myConstraints)
 .build();
 WorkManager.getInstance().enqueue(mywork);

WorkManager 将确保只有在有互联网连接时才执行您的工作。


3
当我添加这个约束条件时,工作管理器不会上传图片,但我的手机已连接到WiFi。有任何想法为什么? - Hamza

3

工作管理器会在后台运行进程,即使没有网络连接也会不断重试该进程,仅当有网络连接并完成数据上传时才完成并停止该进程。

因为您已经指定工作管理器需要网络连接。

val constraints = Constraints.Builder()
                            .setRequiredNetworkType(NetworkType.CONNECTED).build()

val workRequest = OneTimeWorkRequest.Builder(RequestWorker::class.java)
                            .setConstraints(constraints)
                            .build()

只有当网络连接时,工作请求才会被触发,可以将其视为WorkManager侦听网络状态的更改,一旦网络已连接,它就开始处理您的工作请求(doWork)。

我还必须补充说明的是,当您的手机处于飞行模式且具有挂起的工作请求时,即使网络状态为CONNECTED,我目前认为工作请求也不能保证立即开始处理,这点需要注意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接