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

时间:2018-12-19 09:22:54

标签: android android-service

您是否有关于如何解决Android长时间等待服务器响应的想法?

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

我通过将较长的超时设置为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)
    }
  }
}

1 个答案:

答案 0 :(得分:0)

如果此请求花费的时间很长,那么您应该在后台线程中执行此请求,因为要实现此请求,android oreo后台服务受到很大限制,因此可以使用JobIntentServiceJobScheduler或将其设置为ForegroundService,但在这种情况下,您将必须在服务运行时向用户显示通知,您可以在此处https://developer.android.com/about/versions/oreo/background

了解更多信息

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