Android RoboSpice缓存管理和离线模式

时间:2015-01-20 17:38:13

标签: android android-networking robospice

我打算使用RoboSpice + OrmLite进行数据缓存,我希望我的应用程序脱机工作并使用缓存数据。我是RoboSpice的新手。

我想实施以下案例: 如果用户每次从服务器请求互联网连接数据(因为它可以更改)并缓存在db中 如果用户没有互联网连接,则应从数据库中获取数据并永不过期。

getSpiceManager().execute(weatherRequest, new Integer(0), DurationInMillis.ALWAYS_RETURNED, new WeatherRequestListener());

如果我理解正确DurationInMillis.ALWAYS_RETURNED意味着数据将被加载一次,而其他时间从缓存加载。如果有任何选项来实现描述的场景?

我看到类似NetworkStateChecker的内容,可以在SpiceService中覆盖它。也许这是正确的方向。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用SpiceManager#getFromCacheAndLoadFromNetworkIfExpired。来自javadoc:

  

从缓存中获取数据,是否已过期,并且正常执行请求。在调用方法SpiceRequest.loadDataFromNetwork()之前,将检查缓存:如果结果已缓存为缓存键requestCacheKey,RoboSpice将考虑参数cacheExpiryDuration以确定缓存中的结果已过期或未过期。如果它未过期,则侦听器将仅接收缓存中的数据。如果结果不存在或过期,则将调用SpiceRequest.loadDataFromNetwork(),并使用缓存键requestCacheKey将结果存储在缓存中。

它没有完全解释它,但是当缓存过期时,你将从那里得到一个结果。然后,如果您使用了DurationInMillis.ALWAYS_EXPIRED,则每次都会从网络刷新缓存。因此,您只能在另外的请求中从网络获取新数据。

另一种方法是使用RequestListener#onRequestFailure实现SpiceManager#getDataFromCache从缓存加载数据。请注意,在这种情况下,您可能希望实现自定义com.octo.android.robospice.retry.RetryPolicy

最后,NetworkStateChecker在了解互联网连接是否真正有效的情况下是不可靠的,因此在这两种情况下,最好的办法是在每次需要数据时尝试执行请求。