EasyHttp icon indicating copy to clipboard operation
EasyHttp copied to clipboard

缓存策略为USE_CACHE_FIRST能不能提供一个回调用来接收最新的数据

Open w497763094 opened this issue 1 year ago • 5 comments

【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

建议收集

  • issue 是否有人曾提过类似的问题?【必答】无

  • 你觉得框架有什么不足之处?【必答】

  • 缓存策略为USE_CACHE_FIRST时,取到缓存就把回调置空了,这样就导致没办法及时拿到最新的数据去刷新界面了,建议不要把回调置空,或者新增一个回调,okgo里面就有类型的回调,onSuccess和onCacheSuccess

  • 你觉得该怎么去完善会比较好?【非必答】(你可以提供一下自己的想法或者做法供作者参考)

w497763094 avatar Jul 21 '22 11:07 w497763094

小伙子,缓存速度快但数据不是最新的,数据是最新的但请求慢,鱼和熊掌不可兼得,成功的回调调用两次本身就是违背常理的,站在用户的角度上,界面的数据加载出来了,但是后面又重新刷新了一次,难道用户不会觉得这波操作很诡异吗?

getActivity avatar Jul 21 '22 14:07 getActivity

话是这么说,但是架不住总有产品提这样的需求。。所以开发这边也难免会用到这方面的东西

w497763094 avatar Jul 22 '22 01:07 w497763094

小伙子,经过认真思考和慎重考虑,最终不采纳这个建议,原因如下:

  1. 回调两次成功是一件不符合常理的事情,在普通人的认知情况下,一次网络请求成功的回调只会调用一次
  2. 还有第一次使用缓存回调成功,但是假设第二次请求失败了,此时会回调失败监听,那么会给用户造成很奇怪的体验

建议你采用其他方式实现,方式有如下两种:

  1. 使用预加载,即使用无回调的先提前请求一次
  2. 或者你在请求的时候先使用 EasyConfig.getInstance().getHandler().readCache() 读取缓存,然后再发起网络请求

getActivity avatar Jul 23 '22 02:07 getActivity

小伙子,经过认真思考和慎重考虑,最终不采纳这个建议,原因如下:

  1. 回调两次成功是一件不符合常理的事情,在普通人的认知情况下,一次网络请求成功的回调只会调用一次
  2. 还有第一次使用缓存回调成功,但是假设第二次请求失败了,此时会回调失败监听,那么会给用户造成很奇怪的体验

建议你采用其他方式实现,方式有如下两种:

  1. 使用预加载,即使用无回调的先提前请求一次
  2. 或者你在请求的时候先使用 EasyConfig.getInstance().getHandler().readCache() 读取缓存,然后再发起网络请求

我估计之后还可以慎重考虑一下,因为现有逻辑基本上都是这样,如果本地缓存和网络请求都会请求到数据的话,成功回调会回调两次,如果缓存读取成功,网络请求失败,网络请求那次失败就不返回了

Reginer avatar Jul 25 '22 05:07 Reginer

小伙子,暂时不会考虑,我感觉从代码设计上理解不合理,要么缓存,要么网络,但是又想缓存又想网络,是很怪异的。

getActivity avatar Jul 26 '22 12:07 getActivity

缓存占位不是非常常见的需求么?我们拿头条或者任意不联网可显示内容的app来举例,都是先显示缓存同时请求网络之后显示网络数据

Reginer avatar Aug 26 '22 13:08 Reginer

@Reginer 是的,这种场景很常见,但是交由网络请求框架来做是一件太合理的事情,上面我也解释过一遍了。

getActivity avatar Aug 27 '22 04:08 getActivity

但是你有没有想过,USE_CACHE_FIRST是因为什么取出来的这个名字。现在你接受不了也许也正常,随着你以后的更新总会那样实现。 至于实现的逻辑上面已经告诉你了,当然,库是你的。

Reginer avatar Aug 27 '22 04:08 Reginer