Periodi c WorkManager, который создает запрос - PullRequest
0 голосов
/ 09 января 2020

Я хочу использовать 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)
                    }
                }
            }

        })
    }

Мои вопросы:

  1. Если внутри onSuccess и onFailure Я пишу Result.retry(), это означает, что весь процесс будет go включен и до тех пор, пока что-нибудь не убьет рабочего менеджера?

  2. Есть ли лучший способ сделать это, поскольку цель состоит в том, чтобы запрос Push оставался открытым почти всегда, даже когда приложение закрыто.

  3. Где я могу запустить workManager, чтобы у меня не было нескольких экземпляров?

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