我正在使用Worker
构建一个Android应用程序,当按下按钮时,该应用程序将入队一次。 Worker
的{{1}}方法可以返回一些doWork()
,例如:
Data
class MyWorker(context: Context, workerParams: WorkerParameters)
: Worker(context, workerParams) {
override fun doWork(): Result {
val data = Data.Builder().apply {
putIntArray("ints", intArrayOf(1, 2, 3, 4, 5))
}
return Result.success(data.build())
}
}
的调用方式如下:
MyWorker
我注意到,如本示例所示,每当...
findViewById<Button>(R.id.btn_sample).setOnClickListener {
OneTimeWorkRequestBuilder<MyWorker>().build().also { work ->
WorkManager.getInstance(context).apply {
enqueue(work)
getWorkInfoByIdLiveData(work.id).observe(this@SamplerFragment, Observer { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
Log.d(TAG, "${work.id.toString()} : ints=${workInfo.outputData.getIntArray("ints")}")
WorkInfo.State.FAILED ->
Log.w(TAG, "Recording failed.")
else -> Unit
}
})
}
}
}
...
对象包含一个数组时,每次通过按下上述按钮再次调用Data
时,Worker
也会触发所有先前处理的结果,可能会多次。
单击两次按钮后的输出:
Observer
我想再次强调,当D/SamplerFragment: CLICK
D/SamplerFragment: ac386d9d-6e88-43e9-b821-f3848876c4b1 : ints=[I@d941b96
D/SamplerFragment: CLICK
D/SamplerFragment: ac386d9d-6e88-43e9-b821-f3848876c4b1 : ints=[I@4c7d0d2
D/SamplerFragment: ac386d9d-6e88-43e9-b821-f3848876c4b1 : ints=[I@dd0961b
D/SamplerFragment: 739fa49d-e907-4f47-a978-942b9eddf204 : ints=[I@bcbe591
D/SamplerFragment: ac386d9d-6e88-43e9-b821-f3848876c4b1 : ints=[I@290f364
仅包含原始数据(例如,一个int和一个float)时,不会发生这种情况。还要注意,每次记录数组引用时它们都不同。
我想知道为什么会这样吗?获得结果后,我与观察者或工作请求有关系吗?
编辑1:,通过使用Result
而不是enqueueUniqueWork(WORK_NAME, ExistingWorkPolicy.KEEP, work)
将作品排队为唯一作品时,这种行为不再发生。