你有什么想法在如何解决android等待服务器响应的长时间?
我通过将较长的超时设置为45秒然后始终重定向到确认+警告它需要更长时间来解决这个问题。在主屏幕上,我显示“正在处理...”标签,直到服务器完成
但是这个解决方案存在一些问题,例如:如果需要更长时间,或者切换应用程序,如果只是显示器在没有超过30秒的情况下进入睡眠状态,那么用户通过主页按钮出去会怎么样?然后重新创建活动/片段并且响应似乎没有到达。
我认为在处理完成后添加推送通知这可能会有所帮助。有什么方法可以解决这个问题吗?也许一些后台服务?但Android服务是否已被弃用?我认为只有前台服务可以使用,或者可能是新的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)
}
}
}
如果这个请求花了很长时间,那么你应该在后台线程中执行它,因为如果你想实现它,android oreo后台服务变得非常有限,你可以使用JobIntentService
或JobScheduler
或使它成为ForegroundService
但在这种情况下你会有在服务运行时向用户显示通知,您可以在此处阅读更多相关信息https://developer.android.com/about/versions/oreo/background
另一种方法是使用RXjava
来处理线程并非常顺利地执行后台服务