【问题标题】:Method doWork() not calling with WorkManager方法 doWork() 不使用 WorkManager 调用
【发布时间】:2019-03-30 16:47:10
【问题描述】:

我需要将文件从设备上传到我的应用程序。我使用 WorkManager 在后台执行此操作。

将库从 android.arch.work:work-runtime:1.0.0-alpha04 更新到 androidx.work:work-runtime:2.0.0 后出现问题。

方法doWork()没有调用我的UploadFileTask(workerParams: WorkerParameters) : Worker(Application.getContext(), workerParams)

这是我上传的方式:

fun upload(id: String, file: File, params: FileStorage.DocParams?, additionalTag: String): File {
    cancelUploadIfWas(file)
    fileStorage.save(file, params)
    val inputData = Data.Builder().putString(FileTask.PATH_KEY, file.path).build()
    val uploadWork = OneTimeWorkRequest.Builder(UploadFileTask::class.java)
        .addTag(ID_PREFIX + id)
        .addTag(PATH_PREFIX + file.path)
        .addTag(UPLOAD_TAG)
        .addTag(additionalTag)
        .keepResultsForAtLeast(0, TimeUnit.SECONDS)
        .setInputData(inputData)
        .build()

    workManager.enqueue(uploadWork)
    file.uploadStatus.onLoading()
    file.uploadWork=uploadWork
    uploadingFiles.put(ID_PREFIX + id, file)
    workManager.getWorkInfoByIdLiveData(uploadWork.id).observe(this, uploadObserver)
    return file
}

但我的uploadObserver 恰好在State.ENQUEUED 之后收到State.FAILED

我做错了什么?

【问题讨论】:

  • 版本 2.0.0 仅适用于 androidx,您是否使用它而不是支持库?
  • @ronginat 是的,我已经将我所有的支持库都更新到了 AndroidX
  • 您的UploadFileTask 实现中可能存在问题。
  • 设置四个不同的标签来识别您的 WorkRequest 有什么特别的原因吗?然后,您将设置保持结果大约等于 0 的最小持续时间。这似乎很危险,因为它可能会在您查询其状态之前被修剪。将其设置为 0 的原因是什么?
  • 谢谢大家,问题解决了

标签: android androidx android-workmanager


【解决方案1】:

已解决

诀窍在于我们必须通过这种方式创建任务:

UploadFileTask(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams)

我们任务的构造函数必须接收两个参数:context: ContextworkerParams: WorkerParameters

解释:

val downloadWork = OneTimeWorkRequest.Builder(downloadingTask)
            .addTag(ID_TAG)
            .keepResultsForAtLeast(0, TimeUnit.SECONDS)
            .build()

workManager.enqueue(downloadWork)

WorkManager 期望接收downloadWork,它与downloadingTask 一起使用,其构造函数中恰好有两个参数

【讨论】:

  • 你能具体点吗?你到底做了什么改变?我也有这两个参数构造函数,但是既没有调用构造函数,也没有调用 dowork() !!!你能告诉我吗!!
  • @adi 首先我是这样做的:UploadFileTask(workerParams: WorkerParameters): Worker(Application.getContext(), workerParams) 我的UploadFileTask 构造函数中没有上下文参数。但实际上系统在任务构造函数中需要两个参数:UploadFileTask(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams)
  • @adi 我在回答中添加了解释
  • 感谢您的意见。我已经发布了一个关于此的问题。如果可能的话,请看一下:stackoverflow.com/questions/60644939/…
【解决方案2】:

您是否尝试检查发送给工作人员的有效负载/数据的大小?
有时,当您的数据对象对于工作人员限制而言太大时,doWork() 可能不会被调用。

或者,您的 doWork() 方法可能在您没有注意到的情况下引发了一些异常,因此无法继续执行进一步的代码。

您可以尝试:

  • 从您的上传方法中删除 setInputData()
  • 从您的 WorkManager 类中删除 getInputData()
  • 现在为您的doWork() 方法添加一个Log,以检查它是否被调用

【讨论】:

  • 嗨!谢谢您的回答。问题是因为我在 Task 构造函数中只使用了一个参数:UploadFileTask(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams)。 WorkManager 内部有一些反射,因此构造函数中的参数数量很重要。
  • 是的,这也一定会影响到 Worker..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2023-02-24
  • 2015-02-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多