Результат работника Android Данные, которые содержат массив, обрабатываются наблюдателем несколько раз - PullRequest
0 голосов
/ 31 октября 2019

Я создаю приложение 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).

...