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

#### 问题现象

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

#### 背景知识

*   网络连接管理：Network Kit中网络连接管理提供管理网络一些基础能力，包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。
    1.  接收指定网络的状态变化通知。
        
        | 接口 | 描述 |
        | --- | --- |
        | register | 订阅指定网络状态变化的通知。 |
        | on('netAvailable') | 订阅网络可用事件。此接口调用之前需要先调用register接口。 |
        | on('netUnavailable') | 订阅网络不可用事件。此接口调用之前需要先调用register接口。 |
        | on('netLost') | 订阅网络丢失事件。此接口调用之前需要先调用register接口。 |
        | unregister | 取消订阅默认网络状态变化的通知。 |
        
    2.  监控默认网络变化并主动重建网络连接：根据当前网络状态及网络质量情况，默认网络可能会发生变化，监控默认网络的变化后，应用报文能够快速迁移到新默认网络上。
    3.  判断默认网络是否可以访问互联网：
        
        | 方法名 | 描述 |
        | --- | --- |
        | getDefaultNetSync | 使用同步方法获取默认激活的数据网络。 |
        | getNetCapabilitiesSync | netHandle有效的情况下，获取netHandle对应网络的能力信息，使用同步方式返回。 |
        | getDefaultNet | 异步获取默认激活的数据网络。 |
        | getNetCapabilities | 获取netHandle对应网络的能力信息。能力信息包含了网络类型和网络具体能力等网络信息。 |
        

*   Network Boost Kit（网络加速服务）：提供网络质量评估、网络场景识别和应用传输体验反馈。应用可以快速调整应用数传策略（缓存、调速等），实现网络自适应。同时应用将传输体验告知系统，系统综合决策后进行网络加速，从而提升用户的上网体验。

#### 问题定位

1.  对于弱网环境切换到正常网络环境（默认网络未发生变化），根据【**背景知识**】相关网络服务和具体场景分析使用什么网络能力完成数据加载，以HTTP和RCP为例，查看是否有超时机制和重试机制。
    *   HTTP超时重连：搜索HttpRequest.request/HttpRequest.requestInstream，检查是否设置connectTimeout、readTimeout以及setTimeout等方式进行错误处理与重试机制。
    *   RCP超时重连：搜索rcp.createSession，查看相关配置，如connectMs连接超时时间和transferMs传输超时时间等，同时根据创建的会话搜索fetch，检查是否设置setTimeout等错误处理与重试机制。
2.  对于网络类型切换和无网络与有网络之间的切换：
    *   搜索register，检查是否注册网络监听。
    *   搜索on('netAvailable')/on('netLost')等，检查是否在调用register接口后订阅网络可用/丢失等事件。
    *   在上一步监听事件中搜索AppStorage，查看是否正确存储应用全局网络状态，并在对应场景下监听状态变量的变化，根据对应的变化和实际应用场景重新连接网络。重新建立网络连接参考默认网络变化后重新建立网络连接。

#### 场景一

#### 分析结论

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

#### 修改建议

1.  网络超时分为网络连接超时和网络读取超时，网络重试常用的策略有定时重试、指数退避重试、随机退避重试等。
    *   定时重试：设定一个固定的重试次数，当网络请求失败时，在该次数范围内进行重试，每次重试之间的时间间隔可以是固定的，也可以根据具体情况进行调整。例如，设定重试次数为3次，每次重试间隔为2秒。
    *   指数退避重试：每次重试的时间间隔按照指数级增长，如重试间隔时间依次为2、4、8、16等。
    *   随机退避重试：每次重试的时间间隔在一个指定的范围内随机取值。例如，设定重试间隔时间在1秒到5秒之间随机，这样可以避免多个请求同时重试，分散服务器的负载压力，提高整体的重试成功率。
2.  在HarmonyOS中，在HTTP、RCP发生错误或者超时后，都可以使用网络超时重连的机制。示例参考开发步骤。
    
    设置HTTP请求的读取超时时间、连接超时时间。
    
    可以根据网络状态进行判断，然后再进行重连。这样可以在非网络问题的情况下进行重试，可以更精准地控制重试行为，提高请求的成功率和效率。例如，对于一些表示服务错误的响应码（如 500 Internal Server Error、503 Service Unavailable 等），可以进行重试。
    
    使用setTimeout进行函数执行延迟，配合使用Promise，进而同步获取网络请求结果。
    

#### 场景二

#### 分析结论

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

#### 修改建议

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

详情参考开发步骤。