如果没有可用的连接,请存储HTTP / REST请求

时间:2015-08-06 08:54:43

标签: android rest caching httprequest request-queueing

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

到目前为止,我考虑过使用Volley,但就我所知,它只允许重试失败的请求,直到它最终连接。我认为在我通过BroadcastReceiver注册连接状态的更改后,缓存失败的请求并尝试重新发送它将是一个更干净的解决方案。是否有现有的解决方案为我做这个或者我是否必须自己设置内部数据库并管理整个过程?

TL; DR

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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