方法 doWork() 不使用 WorkManager 调用
Method doWork() not calling with WorkManager
我需要将文件从设备上传到我的应用程序。我使用 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
我做错了什么?
已解决
诀窍在于我们必须通过这种方式创建任务:
UploadFileTask(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams)
我们任务的构造函数必须接收两个参数:context: Context
和 workerParams: WorkerParameters
解释:
val downloadWork = OneTimeWorkRequest.Builder(downloadingTask)
.addTag(ID_TAG)
.keepResultsForAtLeast(0, TimeUnit.SECONDS)
.build()
workManager.enqueue(downloadWork)
WorkManager
期望收到 downloadWork
,它是用 downloadingTask
生成的,它的构造函数中正好有两个参数
您是否尝试过检查要发送给工作人员的 payload/data 的尺寸?
有时,当您的数据对象对于工作人员限制来说太大时,可能不会调用 doWork()
。
或者,可能是在您的 doWork()
方法中抛出了一些您没有注意到的异常,因此无法继续执行进一步的代码。
您可以尝试:
- 从您的上传方法中删除
setInputData()
- 从您的 WorkManager class
中删除 getInputData()
- 现在
Log
到您的 doWork()
方法来检查它是否被调用
我需要将文件从设备上传到我的应用程序。我使用 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
我做错了什么?
已解决
诀窍在于我们必须通过这种方式创建任务:
UploadFileTask(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams)
我们任务的构造函数必须接收两个参数:context: Context
和 workerParams: WorkerParameters
解释:
val downloadWork = OneTimeWorkRequest.Builder(downloadingTask)
.addTag(ID_TAG)
.keepResultsForAtLeast(0, TimeUnit.SECONDS)
.build()
workManager.enqueue(downloadWork)
WorkManager
期望收到 downloadWork
,它是用 downloadingTask
生成的,它的构造函数中正好有两个参数
您是否尝试过检查要发送给工作人员的 payload/data 的尺寸?
有时,当您的数据对象对于工作人员限制来说太大时,可能不会调用 doWork()
。
或者,可能是在您的 doWork()
方法中抛出了一些您没有注意到的异常,因此无法继续执行进一步的代码。
您可以尝试:
- 从您的上传方法中删除
setInputData()
- 从您的 WorkManager class 中删除
- 现在
Log
到您的doWork()
方法来检查它是否被调用
getInputData()