Dagger2: как решить JobService? - PullRequest
       7

Dagger2: как решить JobService?

0 голосов
/ 13 сентября 2018

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

Теперь есть еще одна небольшая ошибка: в приложении есть кнопка, которая, когда нажата, должны запланировать работу службы.Я могу реорганизовать свой сервис работы, чтобы его зависимости передавались через его конструктор, но как мне создать его из своей деятельности?Другими словами, как мне заменить этот код:

    val serviceComponent = ComponentName(getApplication(), DbUpdaterJob::class.java)
    var jobInfo = JobInfo.Builder(DB_UPDATER_JOB_ID, serviceComponent)
            .setRequiredNetworkType(networkType)
            .setPersisted(true)
            .build()

    val scheduler = getApplication<Application>().getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
    val res = scheduler.schedule(jobInfo)

, чтобы создание экземпляров перешло к кинжалу?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

После некоторого копания все оказалось проще, чем я думал ... Итак, я создал новый модуль для привязки своей работы:

@Module
abstract class JobBindingModule {
    @ServiceScoped
    @ContributesAndroidInjector
    internal abstract fun provideDbUpdatedJob(): DbUpdaterJob
}

Кстати, ServiceScoped - это новая аннотация, которая выглядит следующим образом:

@Scope
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE, ElementType.METHOD)
annotation class ServiceScoped

Я добавил модуль в свою коллекцию модулей компонентов кинжала. После этого я заменил внедрение параметров конструктора на внедрение свойства:

class DbUpdaterJob: JobService() {
    @Inject
    lateinit var dbManager: NewsManager

И, наконец, я переопределил метод onCreate для добавления необходимых зависимостей:

override fun onCreate() {
    super.onCreate()
    AndroidInjection.inject(this)
}

И, похоже, работает ...

0 голосов
/ 13 сентября 2018

Вам необходимо определить провайдеров:

@Provides
fun provideServiceComponent(app: Application): ComponentName =
        ComponentName(app, DbUpdaterJob::class.java) // assuming you have only one ServiceComponent


@Provides
fun provideJobInfo(
        serviceComponent: ComponentName
): JobInfo =
        JobInfo.Builder(DB_UPDATER_JOB_ID)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
                .setPersisted(true)
                .build()
@Provides
@Singleton
fun provideJobScheduler(app: Application): JobScheduler = app.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

и затем ввести

@Inject constructor(
        jobInfo: JobInfo,
        scheduler: JobScheduler
) {
    val res = scheduler.schedule(jobInfo)
            ...
}

Это становится более сложным, если вы хотите иметь возможность создавать разные ComponentName или JobInfo и т. Д. ВВ этом случае вам нужно использовать инъекции @Named.

...