目录

网络恢复后,页面内容无法刷新

问题现象

在无网络(如未联网或弱网)状态下进入应用后,应用不能正确加载相应界面与数据。当恢复网络连接后,此时页面也无法自动刷新并显示更新后的数据。用户也无法通过任何操作手动触发页面刷新,影响使用体验。

背景知识

问题定位

  1. 对于弱网环境切换到正常网络环境(默认网络未发生变化),根据【背景知识】相关网络服务和具体场景分析使用什么网络能力完成数据加载,以HTTP和RCP为例,查看是否有超时机制和重试机制。
    • HTTP超时重连:搜索HttpRequest.request/HttpRequest.requestInstream,检查是否设置connectTimeout、readTimeout以及setTimeout等方式进行错误处理与重试机制。
    • RCP超时重连:搜索rcp.createSession,查看相关配置,如connectMs连接超时时间和transferMs传输超时时间等,同时根据创建的会话搜索fetch,检查是否设置setTimeout等错误处理与重试机制。
  2. 对于网络类型切换和无网络与有网络之间的切换:

场景一

[h2]分析结论

对于弱网环境切换到正常网络环境(默认网络未发生变化),未使用超时机制和重试机制。如HTTP请求列表数据时,未设置HTTP连接超时和请求重试,导致无法自动或者主动重新发送相关网络请求。

[h2]修改建议

  1. 网络超时分为网络连接超时和网络读取超时,网络重试常用的策略有定时重试、指数退避重试、随机退避重试等。
    • 定时重试:设定一个固定的重试次数,当网络请求失败时,在该次数范围内进行重试,每次重试之间的时间间隔可以是固定的,也可以根据具体情况进行调整。例如,设定重试次数为3次,每次重试间隔为2秒。
    • 指数退避重试:每次重试的时间间隔按照指数级增长,如重试间隔时间依次为2、4、8、16等。
    • 随机退避重试:每次重试的时间间隔在一个指定的范围内随机取值。例如,设定重试间隔时间在1秒到5秒之间随机,这样可以避免多个请求同时重试,分散服务器的负载压力,提高整体的重试成功率。
  2. 在HarmonyOS中,在HTTP、RCP发生错误或者超时后,都可以使用网络超时重连的机制。示例参考开发步骤。

    设置HTTP请求的读取超时时间、连接超时时间。

    可以根据网络状态进行判断,然后再进行重连。这样可以在非网络问题的情况下进行重试,可以更精准地控制重试行为,提高请求的成功率和效率。例如,对于一些表示服务错误的响应码(如 500 Internal Server Error、503 Service Unavailable 等),可以进行重试。

    使用setTimeout进行函数执行延迟,配合使用Promise,进而同步获取网络请求结果。

场景二

[h2]分析结论

对于网络类型切换和无网络与有网络之间的切换:由于未通过监听网络状态变化,未能感知网络发生变化,或者未能正确管理网络状态和状态变量的变化,对网络进行关闭和重连导致故障现象。

[h2]修改建议

  1. 调用register监听网络状态变化,并使用on('netAvailable')/on('netLost')订阅网络可用/丢失等事件。
  2. 使用AppStorage存储应用全局网络状态。
  3. 使用@Watch监听状态变量的变化,并根据对应的变化和实际应用场景重新连接网络。

详情参考开发步骤。