Android - 如何解决长服务器响应等待时间?

问题描述 投票:-1回答:1

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

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

我通过将较长的超时设置为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 android-service
1个回答
0
投票

如果这个请求花了很长时间,那么你应该在后台线程中执行它,因为如果你想实现它,android oreo后台服务变得非常有限,你可以使用JobIntentServiceJobScheduler或使它成为ForegroundService但在这种情况下你会有在服务运行时向用户显示通知,您可以在此处阅读更多相关信息https://developer.android.com/about/versions/oreo/background

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

© www.soinside.com 2019 - 2024. All rights reserved.