HarmonyOS Web嵌套之后多开几个页面,然后跳转到之前的页面,加载会白屏之后显示

web容器加载html调用全屏接口,在跳转5次后,第六次跳转会出现web白屏。使用最新特性离线组件,离线组件中的Text标签正常展示,但是web容器中的html展示异常,而且确定组件树上有web节点。如果不调全屏接口,跳转页面正常,跳转多次也不会白屏。

HarmonyOS
2024-09-05 10:34:53
491浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
zbw_apple

当前web使用BuilderNode通过无状态的UI方法@Builder生成离线web组件。此时创建的web组件是无状态的。

来回切换多次,会创建多个离线web组件,当web创建超过5个时,会触发tabdiscarding机制,冻结部分web实例,使其无法渲染(后台释放资源节省内存),调用全屏接口后,当前调用的web实例被一致被判断为前台,所以一致处于 active状态。后面再次创建的无状态web则被定义为inactive状态。

更详细来讲其实就是一个Frame Eviction Manager机制,是负责管理web中的帧缓存,根据一定的策略将一些不常用或者不重要的帧从内存中移除,以释放内存空间,节省内存提高稳定性。对应的是web源码中的max_number_of_saved_frames_字段,其设置的最大值为5

在每次创建好web实例,调用loadurl时,设置WebController的onActive方法主动激活状态即可解决此问题。需要应用调用相关接口。离线web释放需要先对使用的framenode进行释放,才可析构离线web组件。

参考代码:

build() { 
  Row() { 
    Column() { 
      NavigationExample({ url: this.url, pageStackName: this.pageStackName }) 
    } 
    .width('100%') 
  } 
  .height('100%') 
} 
} 
 
 
export struct NavigationExample { 
  aboutToAppear(): void { 
    Logger.info(TAG, 'NavigationExample aboutToAppear'); 
    GlobalRouter.getInstance().firstLoad(this.url, this.pageStackName); 
  } 
} 
 
 
 
public firstLoad(url: string, pageStackName: string): void { 
 
  // 加载url 
  url = DomainUtil.processDomain(url); 
  let routerStorageInstance: RouterStorage = RouterStorage.getInstance(); 
  let webId: number = WebManager.getInstance().getWebInstanceId(false, url); 
  let routeType: RouteType = RouteType.MULTI_MULTI; 
  let nodeType: number = DomainUtil.getRouterType(url); 
  routerStorageInstance.addRouteType(routeType); 
  routerStorageInstance.addNode(url, webId, nodeType); 
 
  NavigationController.getInstance().pushPath(true, pageStackName); 
 
 
  WebManager.getInstance().getWebController(webId)?.loadUrl(url); 
 
  WebManager.getInstance().getWebController(webId)?.onActive();//设置该web组件onActive 解决该问题 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

解决这个问题 主要是加载的时候 要用 controller的方法 onActive this.controller.onActive。

分享
微博
QQ
微信
回复
2024-09-05 18:25:01


相关问题
HarmonyOS 跳转应用授权页面白屏
864浏览 • 1回复 待解决
HarmonyOS web加载页面图片不显示
1518浏览 • 1回复 待解决
HarmonyOS terminateSelf之后然后台可见
555浏览 • 1回复 待解决
HarmonyOS 怎么跳转到系统页面
979浏览 • 1回复 待解决
如何跳转到WIFI列表页面
1311浏览 • 1回复 待解决
HarmonyOS 如何跳转到应用设置页面
1200浏览 • 1回复 待解决
HarmonyOS如何跳转到发短信页面
1618浏览 • 1回复 待解决