Внедрение репозитория в WorkManager's Worker - PullRequest
0 голосов
/ 25 октября 2018

Вариант использования : мне нужно получить обратную связь от пользователей, сохранить ее в постоянном хранилище, в данном случае в его комнате.И через каждые X минут я хочу отправлять эти сохраненные FeedbackRequest на сервер.

Решение : Я думал об использовании WorkManager, так как это действие должно пережить смерть процесса и также быть запущеннымпериодически.Мне нужно получить список FeedbackRequest из Room DB и использовать клиент Retrofit для отправки каждого FeedbackRequest на сервер.

Определение проблемы : FeedbackRequestRepository, чтоотвечает за получение списка FeedbackRequest, требуется в методе doWork() WorkManager для получения данных из Room DB.Кроме того, я новичок в Dagger2.Я получаю указанную ошибку после открытия приложения.

Фрагмент кода AppComponent

interface AppComponent {
@Component.Builder
interface Builder {
    @BindsInstance
    fun application(application: Application): Builder

    fun build(): AppComponent
}

fun inject(scFeedbackApp: ScFeedbackApp)
fun inject(dispatchWorker: DispatchWorker)

}

Фрагмент кода репозитория

@Singleton
class FeedbackRequestRepository @Inject constructor(
        private val appExecutors: AppExecutors,
        private val db: ScFeedbackDB,
        private val feedbackAcknowledgeDao: FeedbackRequestDao,
        private val scFeedbackFeedbackService: SCFeedbackService
) {

...

}

Фрагмент рабочего кода

class DispatchWorker @Inject constructor(context:Context,
                             workerParameters: WorkerParameters,
                             var feedbackRequestRepository: FeedbackRequestRepository):
    Worker(context, workerParameters){
init {
    DaggerAppComponent.builder().application(context.applicationContext as ScFeedbackApp)
            .build().inject(this)
}
override fun doWork(): Result {

...

}

Ошибка

E/WorkerFactory: Could not instantiate com.scfeedback.service.responseDispatcher.DispatchWorker
java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]
    at java.lang.Class.getConstructor(Class.java:528)
    at java.lang.Class.getDeclaredConstructor(Class.java:507)
    at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:85)
    at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:188)
    at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:124)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
E/WorkerWrapper: Could not create Worker com.scfeedback.service.responseDispatcher.DispatchWorker
  1. Имеет ли эточто-то делать с настройкой Dependency Inject.
  2. Если нет, то где я ошибаюсь.

1 Ответ

0 голосов
/ 25 октября 2018

В вашем подходе есть две проблемы:

  • Вы не можете применить и инжекцию конструктора @inject constructor(...), и прямую инъекцию DaggerAppComponent...inject(this)
  • Вы должны использовать конструктор по умолчанию:

Таким образом, вы можете изменить DispatchWorker на:

    class DispatchWorker constructor(context:Context,
                                 workerParameters: WorkerParameters):
        Worker(context, workerParameters){

        @Inject  lateinit var feedbackRequestRepository: FeedbackRequestRepository

    init {
        DaggerAppComponent.builder().application(context.applicationContext as ScFeedbackApp)
                .build().inject(this)
    }
    override fun doWork(): Result {

    ...

}

Или использовать пользовательский WorkerFactory

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