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

来源:8-17 数据流封装-推送消息处理-1

慕粉3459212

2017-12-29

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

关于这个问题 其实我感觉老师并没有解决,而是模糊带过了 。。。

ContactRepository.class

中将这段代码:

SQLite.select()
       .from(User.class)
       .where(User_Table.isFollow.eq(true))
       .and(User_Table.id.notEq(Account.getUserId()))
       .orderBy(User_Table.name, true)
       .limit(100)
       .async()
       .queryListResultCallback(this)
       .execute();

替换成这段:

new Thread(new Runnable() {
   @Override
   public void run() {
       final List<User> users = SQLite.select()
               .from(User.class)
               .where(User_Table.isFollow.eq(true))
               .and(User_Table.id.notEq(Account.getUserId()))
               .orderBy(User_Table.name, true)
               .limit(100)
               .queryList();
       try {
           Thread.sleep(10000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       Run.onUiAsync(new Action() {
           @Override
           public void call() {
               onListQueryResult(null, users);
           }
       });
   }
}).start();

发现网络请求先回来 后面数据库查询的数据才回来 界面的刷新就会有问题了  

而在onDataSave中添加个boolean做判断是否为预加载数据 解决这个问题

劳烦大家看看是不是我想错了 。。。。


写回答

1回答

Qiujuer

2018-03-13

首先给你一个赞~~

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

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


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


非常抱歉才回复,抱歉。


0
1
weixin_慕尼黑8068974
我也发现了此处问题
2020-03-08
共1条回复

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1749 学习 · 872 问题

查看课程