【问题标题】:Store HTTP/REST requests in case no connection is available在没有可用连接的情况下存储 HTTP/REST 请求
【发布时间】:2015-08-06 08:54:43
【问题描述】:

我目前正在开发一个使用 HTTP/REST 请求与我的后端通信的 android 应用程序。我还没有使用任何特定的库,因为到目前为止内置的HttpURLConnection 对我来说很好。但是,如果我的请求由于连接问题而失败,我希望有某种回退机制。 https://stackoverflow.com/questions/31786486/android-volley-internet-queue 中也描述了一个类似的问题,但尚未得到答复,其他相关帖子更侧重于缓存较旧的响应,以便在没有可用连接时将请求重定向到缓存。

到目前为止,我考虑使用Volley,但据我了解,它只允许重试失败的请求,直到它最终连接。我认为缓存失败的请求并在我通过 BroadcastReceiver 注册连接状态的更改后尝试重新发送它是一种更简洁的解决方案。是否有现有的解决方案可以为我做到这一点,还是我必须建立一个内部数据库并自己管理整个过程?

TL;DR

我想在我的设备离线时将失败的 HTTP/REST 请求存储在我的 Android 设备上,并在设备可以再次建立连接时重新发送它们。我在找什么?

【问题讨论】:

    标签: android rest caching httprequest request-queueing


    【解决方案1】:

    我在报告服务中遇到了同样的情况。我实现的是一个Service,它接收请求并将它们排队。在一个单独的线程中(在服务启动时启动),它检查队列并尝试建立连接。如果您使用BlockingQueue,则线程之间的“信号”是免费的,因此您无需进行空闲轮询。

    您可以使用为WifiManager.WIFI_STATE_CHANGED_ACTION 和/或ConnectivityManager.CONNECTIVITY_ACTION 事件设置接收器,以便您启动服务或唤醒线程并在连接再次建立时尝试重新发送。

    我建议使用服务,以便您可以将所有这些从活动中的代码中分离出来,并拥有一些用于启动和停止它的工具。我个人使用了IntentService,因为它允许我通过 Intent 序列化请求,并让操作系统为我处理 Intent 管理发送。您可能会以不同的方式实现它,即使没有 Service,只需使用 Singleton 对象。

    如果您还需要在应用未运行时存储它们,我会使用 SQLite 数据库。

    【讨论】:

    • 谢谢!存储请求只是我的第一种方法,并不是真正需要的,因此您的解决方案听起来很有希望。如果合适的话,我会尝试找出细节并支持你的解决方案。
    【解决方案2】:

    正如@Sebastian 所写,您可以自己编写队列处理程序,或者检查现有的实现,例如android-priority-jobqueue 是否对您没有用处。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2019-06-09
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多