Как я могу передать лямбду в класс MyWorkManager? - PullRequest
0 голосов
/ 10 апреля 2019

Я использую kotlin для Android и пытаюсь создать универсальный класс Worker, в котором я могу передать лямбду, которую можно вызывать из метода doWork ().

class BaseWorker(val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {

        //Passed from the activity while creating the work request
        someLambda()

        return Result.success()
    }
}

Проблема в том, что я не создаю экземпляр класса BaseWorker, вызывая конструктор. Можно ли пройти лямбду, используя setInputData() класса OneTimeWorkRequestBuilder.

Я упомянул Как передать рабочие параметры в класс WorkManager , где вызывается конструктор класса, что, я думаю, является неправильным.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Класс 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" />
0 голосов
/ 13 апреля 2019

Я думаю, стоит пересмотреть ваш вопрос, чтобы увидеть, что вы пытаетесь сделать и почему он в корне ошибочен. Вы пытаетесь передать лямбду из Деятельности работнику, которая работает в фоновом режиме, даже если Деятельности больше нет. Это не имеет никакого смысла. Пожалуйста, не делайте этого - это приведет только к утечкам памяти, сбоям и / или странным ошибкам, которые вам будет сложно отследить. Помните, что рабочие должны быть в состоянии быть созданы с нуля, когда операционная система говорит вашему приложению запустить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...