Как получить данные из REST API через рабочий класс

#android #kotlin #retrofit2 #rx-java2 #android-workmanager

Вопрос:

Как получить ответ от REST API внутри «рабочего класса» в диспетчере работников? Я попытался реализовать один раз попадание API с помощью WorkerManager. Заранее я попытался реализовать Observable, чтобы попасть в API внутри моего пользовательского рабочего класса, и это работает, но когда я пытаюсь реализовать его внутри рабочего класса, расширяющего рабочего, это не сработало.

Вот мой MyCustomWorker.kt:

 class PersonalCustomWorker(
    val mycustomView: MyCustomView,
    val repository: MyRepository,
    val internetConnectionHelper: InternetConnectionHelper,
    val processScheduler: Scheduler,
    val context: Context,
    mylogic: MyLogicClass?
) : MyCustomWorker(mylogic) {

    private val TAG = "PersonalCustomWorker"
    private val repeatInterval = 24L

    override fun createSupportedActionList(): List<TypeActionId> {
        return arrayListOf(
            TypeActionWorker.REQUEST_FOR_RESPONSE,
            TypeActionWorker.SHOW_RESPONSE_ACCESS
        )
    }

    override fun execute(incomingAction: Action) {
        when (incomingAction.type) {
            TypeActionWorker.REQUEST_FOR_RESPONSE -> handleRequestCheckResponse(
                incomingAction.body as String
            )
            TypeActionWorker.SHOW_RESPONSE_ACCESS -> mycustomView.updateResponse(incomingAction.body as List<String?>)
        }
    }

    private fun handleRequestCheckFeatureAccess(userId: String) {
        val disposable = internetConnectionHelper
            .checkInternetConnection()
            .subscribe {
                if (it) {
                
                    // This method is for calling api inside this class
                    // This one works
                    sendRequestResponseToServer(userId)
                    
                    // This method is to start worker and hit api once in 24 hours
                    // This one doesn't work even calling the same method
                    startWorker(userId)
                    
                } else {
                    mycustomView.showResponseInfoError()
                }
            }
    }

    fun sendRequestResponseToServer(userId: String) {
        val disposable =
            Observable
                .just(userId)
                .flatMap { repository.getResponseAccess(it) }
                .subscribeOn(processScheduler)
                .subscribe(
                    {
                            pushAction(Action(
                                TypeActionWorker.ON_RESPONSE_CHECK_FINAL,
                            it.myResponseList))

                    },
                    {
                        if (it is SSLException) {
                            pushAction(OnAppsCertificateUnverifiedAction())
                        }
                    }
                )
    }
    
    @SuppressLint("RestrictedApi")
    private fun startWorker(userId: String) {
        val workManager = WorkManager.getInstance(context)

        val myWorkBuilder = PeriodicWorkRequest.Builder(
            WorkerClass::class.java,
            repeatInterval,
            TimeUnit.HOURS
        )

        val myConstraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresBatteryNotLow(true)
            .build()

        val myWork = myWorkBuilder
            .setConstraints(myConstraints)
            .addTag(TAG)
            .build()

        workManager.enqueueUniquePeriodicWork(
            TAG,
            ExistingPeriodicWorkPolicy.KEEP,
            myWork
        )
    }

}
 

а вот и мой рабочий класс.кт:

 class WorkerClass(
    val context: Context,
    workerParameters: WorkerParameters
) :
    Worker(context, workerParameters) {

    private val myController = Bison.getInstance()
    private lateinit var mycustomView: MyCustomView
    private lateinit var repository: MyRepositoryImpl
    private lateinit var repositories: MyRepository

    private lateinit var sendRequestFeature: PersonalCustomWorker
    override fun doWork(): Result {
        val userId = IdentityHolder.getInstance().getIdentity().username
        sendRequestFeature.sendRequestResponseToServer(userId)
        return Result.success()
}

}
 

Я в замешательстве, почему, когда я вызываю его внутри MyCustomWorker.kt, я могу получить ответ, но при использовании WorkerClass.kt он даже не вызывал API. Что я сделал не так?