您是否有关于如何解决Android长时间等待服务器响应的想法?
我通过将较长的超时设置为45秒来解决此问题,然后始终重定向到确认+警报,提示它需要更长的时间。 在主屏幕上,我将显示“正在处理...”标签,直到服务器完成
但是此解决方案存在一些问题,例如: 如果用户花费较长时间或切换应用程序,并且仅经过30秒以上的触摸就进入休眠状态,那么用户使用主页按钮出去怎么办?然后重新创建活动/片段,似乎没有收到响应。
我考虑在处理完成后添加推送通知,这可能会有所帮助。有什么办法可以解决这样的问题?也许一些后台服务?但是,是否不赞成使用Android服务?我认为只有Foreground Services才有效,或者可能是新的WorkManagers(但这似乎不适合这种情况)。以及如何从唤醒屏幕将其移至下一页。
代码示例:
// 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)
}
}
}
答案 0 :(得分:0)
如果此请求花费的时间很长,那么您应该在后台线程中执行此请求,因为要实现此请求,android oreo后台服务受到很大限制,因此可以使用JobIntentService
或JobScheduler
或将其设置为ForegroundService
,但在这种情况下,您将必须在服务运行时向用户显示通知,您可以在此处https://developer.android.com/about/versions/oreo/background
另一种方法是使用RXjava
来处理线程并非常顺利地执行后台服务