WorkManager 现有工作策略 APPEND_OR_REPLACE 未按预期运行

2024-01-10

我目前正在使用CoroutineWorker from androidx.work:work-runtime-ktx:2.5.0.

我想要实现的是:

  1. 将工人排队beginUniqueWork和一样uniqueWorkName,有政策ExistingWorkPolicy.APPEND_OR_REPLACE.
  2. 这将按顺序运行工作人员,如果工作失败或被取消,预期的行为将是,根据文档 https://developer.android.com/reference/androidx/work/ExistingWorkPolicy#APPEND_OR_REPLACE:

如果存在失败或取消的先决条件,则这些先决条件将被删除,新指定的工作将成为新序列的开始。

发生的情况是,如果前一个工作人员也被取消(或失败),则所有或排队的工作人员都会被取消。这应该是预期的行为ExistingWorkPolicy.APPEND但不是ExistingWorkPolicy.APPEND_OR_REPLACE.

有什么想法为什么会发生这种情况吗?如何避免排队的唯一工作人员也被取消?


的名字APPEND_OR_REPLACE具有误导性,阅读本文后您会认为这是Worker如果发生故障,将替换以前的工作人员,或者如果正在运行,则追加,这是错误的!

APPEND_OR_REPLACE意味着将此工作人员附加到正在运行的chain或者如果前一个链失败,则用新链替换该链(创建一个新链并重新开始,这就像硬重置)

伪代码

if (getChainWithUniqueTag(TAG).status == CANCELLED || FAILED) {
    createNewChine()
}
addRequestToChainWithTag(TAG,request)

现在应该更有意义了,它是关于当前的状态chain而不是Work


为了进一步确认这一点,尝试用唯一的名称启动一个worker1,然后让它失败(通过调用Result.failure)然后创建另一个worker2APPEND具有相同的唯一名称,worker2会在开始之前直接失败,因为它属于失败链。

如果您尝试相同的场景但使用APPEND_OR_REPLACE, worker2将启动一个新的链条并继续正常工作。

考虑这个例子:

val request1 = OneTimeWorkRequestBuilder<SleepWorker>()
                .setInputData(workDataOf(KEY_BREAK_AT to 5))
                .build()

val request2 = OneTimeWorkRequestBuilder<SleepWorker>()
                .build()
workManager.enqueueUniqueWork(
    TAG,
    ExistingWorkPolicy.APPEND_OR_REPLACE,
    request1
)
// Infinite loop
while (workManager.getWorkInfoById(request1.id).get().state == WorkInfo.State.RUNNING){}

workManager.enqueueUniqueWork(
    TAG,
    ExistingWorkPolicy.APPEND_OR_REPLACE,
    request2
)

SleepWorker

class SleepWorker(context: Context, parameters: WorkerParameters) :
        CoroutineWorker(context, parameters) {
        override suspend fun doWork(): Result {
            val breakAt = inputData.getInt(KEY_BREAK_AT,-1)
            repeat(10) {
                if(it == breakAt) return Result.failure()
                println("$it")
                delay(1000L)
            }
            return Result.success()
        }
}

现在在这种情况下,request1会失败,然后我们开始request2并且它会正常启动,因为FLAG是APPEND_OR_REPLACE, 如果标志是APPEND then request2将失败。

PS:尝试移动第二个enqueueUniqueWork for request2在无限之前while loop, request2也会失败。有道理吗?

因为当我们打电话时enqueueUniqueWork当时该链条很好,因此该作业已成功添加到该链条中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WorkManager 现有工作策略 APPEND_OR_REPLACE 未按预期运行 的相关文章

  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • ActionBarCompat 支持库 android:selectableItemBackground 不起作用

    我正在使用新的 ActionBarCompat 支持库 操作栏中的操作按钮在按下时应更改其背景 它适用于 Android 4 3 但不适用于 Gingerbread 在姜饼中 如果我按下按钮 它不会改变背景 我什至改变了选择器 它再次适用于
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • 如何从静态快捷方式启动活动的现有实例

    我的应用程序中有一个活动 MainActivity 并且有一个静态快捷方式 指向 TempActivity 由于静态快捷方式将始终设置 FLAG ACTIVITY NEW TASK 和 FLAG ACTIVITY CLEAR TASK 因此
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • Android Things 文件系统

    我正在 Android 上构建这个应用程序 我希望能够让它访问 U 盘上的媒体文件 甚至树莓派的 SD 卡上的媒体文件 我还不知道我将如何处理这些文件 但我只是想知道它是否可能 如果不是这样也没关系 我还有其他解决方案 但我想我会先从明显的
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • MAT(Eclipse 内存分析器)- 如何从内存转储中查看位图

    I m analyzing memory usage of my Android app with help of Eclipse Memory Analyzer http www eclipse org mat also known as
  • ImageButton 拉伸背景图像

    我正在尝试创建一个没有边框的 ImageButton 但遇到了图像按钮大小的问题 我使用 Eclipse ADT 将 ImageButton 拖到布局中并选择背景图像 图像按钮显示如下 正如您所看到的 背景图像和图像按钮周边之间有一个边框
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 如果联系人与电话通讯录中的应用程序关联,则显示应用程序图标

    我正在尝试显示与该应用程序关联的电话号码的应用程序图标 我试着跟随this http www c99 org 2010 01 23 writing an android sync provider part 1 链接但是太难了 有没有任何库
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • Android 视图和视图组

    在安卓中ViewGroup继承自View A ViewGroup是一个容器 里面装有Views ViewGroup LinearLayout View TextView 为什么 Android 的人们将这种关系定义为Inheritance而
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi
  • Android:列“_id”不存在

    我收到这个错误 IllegalArgumentException 列 id 不存在 当使用SimpleCursorAdapter从我的数据库中检索 该表确实有这个 id柱子 注意到这是一个常见问题 我尝试根据网上的一些解决方案来解决它 但它
  • Android 中带有无尽列表视图滚动的 AsyncTask

    我正在创建一个应用程序 其中我需要有无限的滚动列表视图 我不想在我的应用程序中使用任何库 我在网上看到了一些有助于实现此类列表视图的示例 但我的疑问是 当我的数据来自服务器并在异步任务中进行解析时 如何才能拥有无尽的列表视图 如何从滚动异步
  • 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

    我已将 firebase 消息传递添加到我的 Flutter 项目中 在 iOS 上运行良好 在 Android 上运行时出现错误 Android dependency androidx localbroadcastmanager loca

随机推荐