#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. Что я сделал не так?