Android - как решить долгое время ожидания ответа сервера? - PullRequest
0 голосов
/ 19 декабря 2018

У вас есть идеи как решить в андроиде долгое время ожидания ответа сервера?

  1. Я делаю запрос к профилю сохранения API.
  2. Этот запрос быстрый
  3. Но сервер обрабатывает его довольно долго от 10 секунд до 3 минут (как сканированиедешевый рейс на некоторых сайтах билетов)
  4. После ответа мне нужно перенаправить пользователя на экран подтверждения или домашний экран приложения.

Я решил эту проблему, установив более длительное время ожидания на 45 секунд, а затем всегда перенаправляя на подтверждение + оповещение о том, что это занимает больше времени.На главном экране я отображаю ярлык «Обработка ...» до тех пор, пока сервер не завершит работу

Но у этого решения есть некоторые проблемы, такие как: как пользователь выходит из режима кнопки «Домой», если это занимает больше времени, или переключает приложения,а если просто дисплей уходит спать пока нетронутый больше 30сек?Затем действие / фрагмент воссоздается, и ответ, кажется, не приходит.

Я думаю, что добавление push-уведомлений по завершении обработки может немного помочь.Есть ли способ решить такую ​​проблему?Может быть, какой-то фоновый сервис?Но разве Службы Android не устарели?Я думаю, что только Foreground Services допустимы для использования, или, возможно, новые WorkManager (но это, кажется, не соответствует этому сценарию).И как с этого момента проснуться экран и переместить его на следующую страницу.

Пример кода:

// Fragment 
viewModel.saveData(data)

// View Model 

fun saveData(data: Data) : LiveData<Resource<DataResponse>> {

        _dataEvent.postValue(Event(Resource.loading(null)))

        val apiSource = dataRepo.saveData(data)

        _dataEvent.addSource(apiSource) { resource ->
            _dataEvent.removeSource(apiSource)

            val resource = resource ?: Resource.error(null, null)
            _dataEvent.postValue(Event(resource))
        }

        return apiSource
    }

// Observing Data Event 

viewModel.dataEvent.observe(this,
                Observer { event ->

                    if(event?.peekContent()?.status == Resource.Status.LOADING) {
                        showProgressAlert(context)
                        event.getContentIfNotHandled() // consume loading event
                    }

                    val resource = event?.getContentIfNotHandled()
                    if(resource != null) {
                        hideProgressAlert()

                        if (resource.status == Resource.Status.SUCCESS) {
                            showSuccessAlert(context)
                           navigateToConfirmPage()
    } else if (resource.status == Resource.Status.ERROR) {

    if (throwable is SocketTimeoutException) {
        showTimeoutAlert(context)
        navigateToConfirmPage()
    } else { 
        showErrorAlert(context)
    }
  }
}

1 Ответ

0 голосов
/ 19 декабря 2018

Если этот запрос занимает много времени, то вы должны выполнить его в фоновом потоке, так как фоновые службы android oreo стали очень ограниченными, если вы хотите реализовать его, вы можете использовать JobIntentService или JobScheduler или сделать его ForegroundService, но в этом случае вам нужно будет показать пользователю уведомление во время работы службы. Подробнее об этом можно прочитать здесь https://developer.android.com/about/versions/oreo/background

Другой подход заключается в использовании RXjava, которыйочень плавно обрабатывает потоки и выполняет фоновые службы

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