安卓 - 如何解决服务器响应等待时间长的问题?



您对如何在长时间等待服务器响应的android中解决有什么想法吗?

  1. 我正在向 API 保存配置文件发出请求。
  2. 此请求很快
  3. 但是服务器处理它的时间相当长 10 秒到 3 分钟(就像扫描某些票务网站上的廉价航班一样)
  4. 响应后,我需要将用户重定向到应用程序的确认屏幕或主屏幕。

我通过将较长的超时设置为 45 秒,然后始终重定向到确认 + 警报需要更长的时间来解决此问题。 在主屏幕上,我显示"正在处理..."标签,直到服务器完成

但是此解决方案存在一些问题,例如: 如果用户通过主页按钮外出,如果需要更长的时间,或者切换应用程序,并且如果只是显示器在未触及的情况下进入睡眠状态超过 30 秒怎么办?然后重新创建活动/片段,响应似乎没有到达。

我考虑在处理完成后添加推送通知,这可能会有所帮助。有没有办法解决这样的问题?也许是一些后台服务?但是安卓服务不是被弃用了吗?我认为只有前台服务是有效的,或者可能是新的工作管理器(但这似乎不适合这种情况)。以及如何从那时唤醒屏幕并将其移动到下一页。

代码示例:

// 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)
}
}
}

如果此请求需要很长时间,则应在后台线程中执行它, 由于 android oreo 后台服务变得非常受限 如果你想实现它,你可以使用JobIntentServiceJobScheduler或使其成为一个ForegroundService但在这种情况下,你必须在服务运行时向用户显示通知, 您可以在此处阅读有关它的更多信息 https://developer.android.com/about/versions/oreo/background

另一种方法是使用RXjava来处理线程并非常顺利地执行后台服务

最新更新