У вас есть идеи как решить в андроиде долгое время ожидания ответа сервера?
- Я делаю запрос к профилю сохранения API.
- Этот запрос быстрый
- Но сервер обрабатывает его довольно долго от 10 секунд до 3 минут (как сканированиедешевый рейс на некоторых сайтах билетов)
- После ответа мне нужно перенаправить пользователя на экран подтверждения или домашний экран приложения.
Я решил эту проблему, установив более длительное время ожидания на 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)
}
}
}