观察者将

时间:2019-10-31 14:34:13

标签: android kotlin android-workmanager

我正在使用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)将作品排队为唯一作品时,这种行为不再发生。

0 个答案:

没有答案