6

从我从文档https://developer.android.com/topic/libraries/architecture/workmanager中读到的内容,

它说:

即使您的应用程序被强制退出或设备重新启动,该任务仍然可以保证运行。

那么这意味着在后台的执行将 100% 执行直到它完成为止呢?

举个例子:

应用程序具有执行将数据上传到在线数据库的工作管理器实施的按钮,但它需要 Internet 连接才能上传数据。因此,我的应用程序当前处于离线模式,我单击了按钮。

我的不确定性:

工作管理器是否会在后台运行该进程,并在没有 Internet 连接的情况下继续重试该进程?并且仅在有 Internet 连接并完成数据上传之前完成并停止该过程?

4

2 回答 2

9

工作管理器是否会在后台运行该进程,并在没有 Internet 连接的情况下继续重试该进程?并且仅在有 Internet 连接并完成数据上传之前完成并停止该过程?

它不会隐式地尝试连续执行工作并且只有在成功时才停止。这将取决于返回的 ResultdoWork()或您的Worker. 如果它返回RETRY,那么将使用中指定的退避重试该工作WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, long, TimeUnit)

但是,如果您需要在有 Internet 连接时执行某些操作,那么您可以指定适当的约束。对于网络连接,您可以设置如下约束:

Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();

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

WorkManager将确保您的工作仅在有互联网连接的情况下执行。

于 2018-07-30T03:53:57.533 回答
3

工作管理器是否会在后台运行该进程,并在没有 Internet 连接的情况下继续重试该进程?并且仅在有 Internet 连接并完成数据上传之前完成并停止该过程?

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

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

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

在有网络连接之前不会触发工作请求,将其视为WorkManager监听 NetworkState 的变化,一旦网络连接,它就会开始处理您的 workRequest(doWork)。

我还必须补充一点,当您的手机处于 AirPlane 模式并且您的手机以待处理的工作请求重新启动时,我目前认为即使网络状态为 CONNECTED,工作请求也不能保证立即开始处理。

于 2018-08-01T22:50:12.083 回答