Я хочу использовать WorkManager, чтобы я мог бесконечно запускать процесс каждые 15 минут.
Процесс следующий: я хочу запустить запрос с именем Push
. Сервер не ответит мне, если он не сможет мне что-то дать. В этом случае я сделаю еще один запрос под названием Sync
, который выполняет свою работу, и снова начну Push
. В случае TimeoutException
я хочу снова запустить Push
.
Весь этот процесс будет проходить внутри метода WorkManager doWork
, поэтому каждый раз, когда периодически запускается рабочий менеджер, я хочу уничтожить все описанные выше процессы и начните все заново.
Мой метод doWork
подобен приведенному ниже
override suspend fun doWork(): Result = coroutineScope {
// ToDo Get all accounts
AppDatabase.invoke(context).accountsDao().getCredentials().let {
if (it.isNullOrEmpty()) Result.failure()
// ToDo Create PushRequest for each one
it.forEach { account ->
if (account.rUserDto == null) return@forEach
if (account.accountDto == null) return@forEach
createPushRequest(account)
}
}
Result.success()
}
И pushRequest является запросом залпа с 30se c таймаутом и 30 повторными попытками
private fun createPushRequest(serverAccount: ServerAccount) {
val pushRequest = <<MyJsonIwantToSend>>
PushRequests.pushRequest(..serverAddress..., pushRequest, object: RequestInterfaces.VolleyCallbackPush {
override fun onSuccess(jsonObject: JSONObject) {
Gson().fromJson(jsonObject.toString(), PushResponse::class.java)?.let { pushResponse ->
pushResponse.status?.let { status ->
if (status == 1) {
// ToDo Create Sync request to server
createSyncRequest(serverAccount)
}
}
}
createPushRequest(serverAccount)
}
override fun onError(volleyError: VolleyError) {
volleyError.printStackTrace()
if (volleyError.networkResponse == null) {
if (volleyError.javaClass == TimeoutError::class.java) {
createPushRequest(serverAccount)
}
}
}
})
}
Мои вопросы:
Если внутри onSuccess
и onFailure
Я пишу Result.retry()
, это означает, что весь процесс будет go включен и до тех пор, пока что-нибудь не убьет рабочего менеджера?
Есть ли лучший способ сделать это, поскольку цель состоит в том, чтобы запрос Push
оставался открытым почти всегда, даже когда приложение закрыто.
Где я могу запустить workManager, чтобы у меня не было нескольких экземпляров?