【每日学点鸿蒙知识】屏幕高度、证书签名、深色模式对上架影响、Taskpool上下文、List触底加载更多
1、HarmonyOS 关于屏幕高度?
display.getDefaultDisplaySync 可以获取到整个屏幕的高度, 那顶部的状态栏和底部的安全区高度 怎么获取?
可以在EntryAbility里获取并存储,获取到的高度是px,所以用px2vp()转换为vp使用:
onWindowStageCreate(windowStage: window.WindowStage) {
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
let windowClass = windowStage.getMainWindowSync();
let statusHeight = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height;
let bottomHeight = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect.height;
AppStorage.setOrCreate('bottomHeight',px2vp(bottomHeight));
AppStorage.setOrCreate('statusHeight',px2vp(statusHeight));
});
}
在需要的界面使用 AppStorage.get(‘bottomHeight’),AppStorage.get(‘statusHeight’) 获取。
2、HarmonyOS 使用发布证书进行手动签名配置,不能运行安装应用到工程机上?
使用发布证书配置了手动签名,.cer和.p7b文件都是从AppGallery Connect上下载下来的。但是在DevEco Studio上点击运行,不能在工程机上安装。提示错误如下:安装HAP时提示“code:9568322 error: signature verification failed due to not trusted app source”。
使用发布证书进行手动签名安装hap包,同样要配置注册调试设备吗? 但是AppGallery Connect发布证书选项没有配置注册调试设备的地方。
该问题是由于签名中未包含该调试设备的UDID,请通过如下步骤进行解决。
- 使用自动签名。在连接设备后,重新为应用进行签名。具体步骤为:进入File > Project Structure > Project > Signing Configs界面,勾选“Automatically generate signature”(如果是API 8和9工程,需同时勾选“SupportHarmonyOS”),即可完成签名。如果未登录,请先单击Sign In进行登录,然后自动完成签名。
- 如果使用的是手动签名,请在AppGallery Connect中先将该调试设备注册调试设备并在申请Profile文件选择设备时添加该调试设备,重新申请Profile证书。发布证书签名的包是不能在本地进行调试安装
3、HarmonyOS APP未适配深色模式是否影响最终版本上架?
- APP未适配深色模式是否影响版本上架?
- 深色模式适配是否必须同时适配 手机、平板、2in1(pc)设备三端?
可以主动设置浅色模式,应用默认配置为跟随系统切换深浅色模式,如不希望应用跟随系统深浅色模式变化,可主动设置应用的深浅色风格。设置后,应用的深浅色模式固定,不会随系统改变。参考地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-light-dark-color-adaptation-V5#section19361879317
设置为浅色模式代码:getContext(this).getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT);
4、HarmonyOS 如何在taskPool中的@Concurrent方法中获取应用Context上下文?
在taskPool中的@Concurrent方法中直接调用getContext()会抛出异常,需要在taskPool中使用preference存储和relationalStore数据库;如何在taskPool中的@Concurrent方法安全的获取当前应该的ApplicationContext对象
@Concurrent允许使用local变量、入参和通过import引入的变量。禁止使用闭包变量。看下@Concurrent使用方法是否有误
5、HarmonyOS List 组件有触底加载更多的属性或方法吗?
可使用onReachEnd事件实现数据懒加载,在onReachEnd事件触发时,回调函数中异步获取指定条数的列表数据,每次列表滑动到底部获取下一页数据。
可参考如下官方文档:
- 长列表加载性能优化:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/bpta-best-practices-long-list#section69931513103314
LazyForEach懒加载的原理和渲染过程如下:
- LazyForEach会根据屏幕可视区能够容纳显示的组件数量按需加载数据。
- 根据加载的数据量创建组件,挂载在组件树上,构建出一棵短小的组件树。即,屏幕可以展示多少列表项组件,就按需创建多少个ListItem组件节点挂载在List组件树根节点上。
- 屏幕可视区只展示部分组件。当可视区外的组件需要在屏幕内显示时,需要从头完成数据加载、组件创建、挂载组件树这一过程,直至渲染到屏幕上。
其数据加载、组件树挂载、页面渲染的示意图如下所示:
sh
LazyForEach实现了按需加载,针对列表数据量大、列表组件复杂的场景,减少了页面首次启动时一次性加载数据的时间消耗,减少了内存峰值。不过在长列表滑动的过程中,因为需要根据用户的滑动行为不断地加载新的内容,这需要进行额外的数据请求和处理,会增加滑动时的计算量,从而对性能产生一定的影响。然而,合理使用LazyForEach的按需加载能力,通过在滑动停止或达到某个阈值时才进行加载,可以减少不必要的计算和请求,从而提高性能,给用户带来更好的体验。总之,在实现按需加载的场景中,需要综合考虑性能和用户体验的平衡,合理地优化加载逻辑和渲染方式,以提升整体的性能表现。
- LazyForEach:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-rendering-control-lazyforeach-V5
LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。