Класс Data
в WorkManager предназначен только для базовых типов и их массивов. Вы не можете использовать его, чтобы передать ламбу.
Возможное решение - настроить инициализацию WorkManager , как описано в документации , и использовать пользовательский WorkerFactory для добавления параметра в конструктор, который можно использовать для получения лямбда-выражения. Помните, что вы настраиваете WorkManager только один раз, во время инициализации. Это означает, что вы можете напрямую передать лямбду в качестве дополнительного параметра, но настроить ее для каждого WorkRequest будет невозможно.
В зависимости от того, чего именно вы хотите достичь, в качестве отправной точки можно использовать нечто подобное:
// provide custom configuration
val config = Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.setWorkerFactory(MyWorkerFactory(lambda))
.build()
//initialize WorkManager
WorkManager.initialize(this, config)
val workManager = WorkManager.getInstance()
И тогда ваш WorkerFactory:
class MyWorkerFactory(private val lambda: Unit) : WorkerFactory() {
override fun createWorker(appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters): BlurWorker {
return MyWorker(_testContext, workerParameters, lambda)
}
}
После этого вы можете получить своего работника, который использует новый конструктор:
class MyWorker(val context: Context, workerParams: WorkerParameters, private val lambda: Unit) : Worker(context, workerParams) {
override fun doWork(): Result {
//Passed from the WorkManager's configuration
lambda()
return Result.success()
}
}
Не забудьте отключить инициализацию WorkManager по умолчанию, добавив к AndroidManifest.xml
:
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />