Я создаю приложение Android с Worker
, которое будет помещено в очередь один раз при нажатии кнопки. Метод Worker
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
Я хочу еще раз подчеркнуть, что этого не происходит, когда Result
содержит только примитивные данные (например, одно целое и число с плавающей точкой). Также обратите внимание, что ссылки на массивы отличаются каждый раз, когда они регистрируются.
Мне интересно, почему это происходит? Есть ли что-то, что я должен сделать с наблюдателем или запросом на работу после получения результата?
РЕДАКТИРОВАТЬ 1: такого поведения больше не происходило, когда работа ставилась в очередь какуникальная работа, используя enqueueUniqueWork(WORK_NAME, ExistingWorkPolicy.KEEP, work)
вместо enqueue(work)
.