请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

本地刷新和网络刷新,在添加到界面的时候会有可能冲突;导致数据显示异常———提问2

老师关于17年同学对这方面的提问
https://coding.imooc.com/learn/questiondetail/37313.html
你给出了以下回答

首先给你一个赞~~

你的思路是正确的,这里的确存在冲突的情况,如果网络足够快,而数据库查询慢的情况会导致数据显示异常的问题;要解决这个问题也很简单,将这边显示到页面的逻辑丢入到一个单线程队列中去运行。

然后网络返回的数据先进行数据库入库,然后再次进入到队列中执行,那么就不存在这个问题了。

这个问题是因为多线程的并发,而没有统一的消费者来做顺序执行会导致的问题,感谢你的指出。

非常抱歉才回复,抱歉。


我也发现了这个问题。这个漏洞是否有进展?
或者 按照你给出的思路,我理解了一下,你看对不对:

开始 假如本地加载和网络加载是同时进行,而开始本地加载采用直接进入一个单线程队列里进行。网络加载回来后先入库,之后也同样进入到上面那个单线程队列,这样就保证了网络加载就一定在本地加载的后面,就不会出现数据过期的问题了是吗?

正在回答

1回答

解决办法有两个:
1. 在本地加载之后再进行网络请求,用户等待时间会偏长一些
2. 启动本地加载、启动网络加载、网络回来后直接入库到本地缓存中-使用本地缓存监听器更新界面
3. 启动本地加载、启动网络加载,若网络加载先回来本地内存保存一个变量区分即可,当本地加载回来时若有该标志,则不更新界面。

以上3种方案都是可以做到修复上述BUG的能力。

1 回复 有任何疑惑可以回复我~
  • 老师,第二个没懂…
    原本是:
    本地查,查到后触发一次观察者的通知方法更新
    网络查,查到后入库,然后正常走观察者更新
    就怕网络先到本地后到,因为在查询的时候都是在子线程中。
    您说的第二方案,本地缓存不是本地数据库?缓存监听器不是那个观察者吗?还是说另外的机制?
    回复 有任何疑惑可以回复我~ 2020-03-16 00:06:30
  • 第三个大概知道在哪里判断,第二个没明白…
    回复 有任何疑惑可以回复我~ 2020-03-16 00:09:18
  • Qiujuer 回复 提问者 weixin_慕尼黑8068974 #3
    这里的第二个方案细节如下:
    1. 数据库首先查询,并且返回界面
    2. 网络数据此时就算比数据库插入更早回来,但是网络数据不直接更新界面,而是通过排队插入更新到数据库中,此时我们可以在数据库的仓库维护代码中加上锁,等待数据库第一次查询完成后再进行增量更新。
    3. 网络数据成功插入到本地数据库中增量更新,触发本地数据库观察者
    4. 进行数据的增量更新
    5. 通知给界面进行界面刷新
    回复 有任何疑惑可以回复我~ 2020-03-23 23:47:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信