我打算使用RoboSpice + OrmLite进行数据缓存,我希望我的应用程序脱机工作并使用缓存数据。我是RoboSpice的新手。
我想实施以下案例: 如果用户每次从服务器请求互联网连接数据(因为它可以更改)并缓存在db中 如果用户没有互联网连接,则应从数据库中获取数据并永不过期。
getSpiceManager().execute(weatherRequest, new Integer(0), DurationInMillis.ALWAYS_RETURNED, new WeatherRequestListener());
如果我理解正确DurationInMillis.ALWAYS_RETURNED
意味着数据将被加载一次,而其他时间从缓存加载。如果有任何选项来实现描述的场景?
我看到类似NetworkStateChecker
的内容,可以在SpiceService中覆盖它。也许这是正确的方向。
答案 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
在了解互联网连接是否真正有效的情况下是不可靠的,因此在这两种情况下,最好的办法是在每次需要数据时尝试执行请求。