Android MVVM架构无法同步MySQL服务端更新数据问题求助
问题解答
关于MySQL数据能否自动同步到App的问题
默认情况下MySQL数据变更无法直接自动同步到App端,原因如下:
- 你当前使用的HTTP短连接请求属于客户端主动拉取模式,只有App主动发起接口请求时,服务端才会返回最新的数据库数据,服务端/数据库本身不会主动向App推送数据变更。
- 如果需要实现接近“自动同步”的效果,你需要额外开发推送链路:
- 低实时性需求可以用客户端定时轮询,每隔固定时间主动调用一次拉取接口
- 高实时性需求可以在服务端集成WebSocket、MQTT等长连接方案,数据库数据变更时由服务端主动向App推送更新通知,App收到通知后再拉取最新数据即可。
当前实现存在的问题
你的代码逻辑只在App首次启动时拉取了一次数据,之后不会再发起新的请求,自然无法获取更新后的数据库数据,具体问题点:
- 接口请求仅触发一次
ViewModel 中的getPostsDataFromViewModel()方法做了非空判断,只有getPosts为null时才会调用apiRepo.getPostsDataFromRepo()发起网络请求,后续再调用该方法只会返回已经存在的LiveData对象,不会发起新的请求。
// 现有逻辑只请求一次 public LiveData<List<Post>> getPostsDataFromViewModel(){ if(getPosts == null) { getPosts = apiRepo.getPostsDataFromRepo(); } return getPosts; }
- 无数据刷新触发逻辑
当前代码仅在MainActivity的onCreate生命周期回调中触发了一次数据拉取,没有下拉刷新、定时任务、推送接收等触发重新拉取数据的逻辑。 - 返回的LiveData仅赋值一次
ApiRepo的getPostsDataFromRepo()方法每次调用才会发起请求并给新建的LiveData赋值,你全局只调用了该方法一次,对应的LiveData自然不会有新数据通知UI更新。
另外你贴出的Logcat报错均为系统图形渲染相关的警告,和数据不更新的问题无关联,不需要处理。
修复建议
手动刷新方案(最常用)
给ViewModel新增刷新方法,触发时重新发起接口请求,将新数据更新到已有的LiveData中,UI侧观察到LiveData变化就会自动更新:
// ViewModel 新增方法 public void refreshPosts(){ apiRepo.getPostsDataFromRepo().observeForever(newPosts -> { if(getPosts != null){ getPosts.postValue(newPosts); } }); }
之后你可以在页面加下拉刷新控件,用户触发下拉刷新时调用viewModel.refreshPosts()即可获取最新数据。
自动同步方案
如果需要无感知自动更新,可以在App中加固定间隔的定时任务,每隔一段时间调用一次refreshPosts()方法拉取最新数据;如果对实时性要求高,就对接服务端长连接推送,收到推送更新通知时调用refreshPosts()即可。
内容的提问来源于stack exchange,提问作者Coding Freak
相关产品推荐
相关产品推荐

