You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MVVM架构无法同步MySQL服务端更新数据问题求助

问题解答

关于MySQL数据能否自动同步到App的问题

默认情况下MySQL数据变更无法直接自动同步到App端,原因如下:

  • 你当前使用的HTTP短连接请求属于客户端主动拉取模式,只有App主动发起接口请求时,服务端才会返回最新的数据库数据,服务端/数据库本身不会主动向App推送数据变更。
  • 如果需要实现接近“自动同步”的效果,你需要额外开发推送链路:
    • 低实时性需求可以用客户端定时轮询,每隔固定时间主动调用一次拉取接口
    • 高实时性需求可以在服务端集成WebSocket、MQTT等长连接方案,数据库数据变更时由服务端主动向App推送更新通知,App收到通知后再拉取最新数据即可。

当前实现存在的问题

你的代码逻辑只在App首次启动时拉取了一次数据,之后不会再发起新的请求,自然无法获取更新后的数据库数据,具体问题点:

  1. 接口请求仅触发一次
    ViewModel 中的getPostsDataFromViewModel()方法做了非空判断,只有getPosts为null时才会调用apiRepo.getPostsDataFromRepo()发起网络请求,后续再调用该方法只会返回已经存在的LiveData对象,不会发起新的请求。
// 现有逻辑只请求一次
public LiveData<List<Post>> getPostsDataFromViewModel(){
    if(getPosts == null) {
        getPosts = apiRepo.getPostsDataFromRepo();
    }
    return getPosts;
}
  1. 无数据刷新触发逻辑
    当前代码仅在MainActivity的onCreate生命周期回调中触发了一次数据拉取,没有下拉刷新、定时任务、推送接收等触发重新拉取数据的逻辑。
  2. 返回的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:57:03