内存受限?4字诀优化建议请你收下!

作者:dingminglei ,华为软件开发工程师

HarmonyOS JS(JavaScript)应用开发框架提供了一套跨平台的类Web应用开发框架,通过Toolkit将开发者编写的HML、CSS和JS 文件编译打包成JS Bundle,再将JS Bundle解析运行成C++ UIKit的View 组件进行渲染。

HarmonyOS JS应用开发框架通过支持开发者使用声明式的API进行应用开发,以数据驱动视图变化,避免了大量的视图操作,大大降低了应用开发难度,提升开发者开发体验。
由于部分设备内存限制(如LiteWearable),因此JS引擎内存最大值限制为48~64KB。其中,框架默认使用约9KB,如果应用的业务逻辑或页面太复杂就很容易导致内存不足,从而出现应用闪退等异常的情况。
所以,在JS应用开发的过程中,开发者要格外注意内存的使用。

今天,我们针对内存有限的智能穿戴设备,给大家提出一些在开发该类应用时应该注意的事项。主要分为四个方面——

在使用DevEco Studio进行开发调试的过程中,如图1显示可以点击下方的Simulator Profiler按钮(需要项目运行调试状态下才能使用)打开Simulator Profiler页面,在此界面可以查看应用的JS Memory的使用情况;一旦发现内存的使用有大或者异常的增长,需及时确认解决,不要将问题累计到APP开发完成后进行定位调试。
(图1)

应用的内存使用情况如图1右上角的信息所示:

●第一项表示当前已使用的JS内存值;

●第二项表示应用运行过程中使用的内存峰值;

●第三项表示总的内存值;

开发中需要特别注意的是不要让使用内存逼近总内存。因为在应用运行过程中存在部分动态申请内存的操作,如果当前使用的内存较高,就会出现申请不到内存进而导致内存溢出的情况发生。另外,部分API调用逻辑也会对内存造成额外压力。

由于内存总大小的限制,在保证业务完整的情况下,应尽量减少组件使用数量,并且使用较为简单的组件来实现业务功能。

下面举几个例子:

示例一

如图2-1所示,一个APP中使用了3个text控件去展示三行文字。实际上text是支持多行文字的(见图2-2),一个text足以实现该效果。

(图2-1)

(图2-2)

示例二

删除默认样式,也可以减少部分内存消耗。如图3所示,flex-direction的默认值为row,就没有必要再次设置组件flex-direction的属性值为row。

(图3)

智能穿戴设备JS应用同一时间只能运行一个页面。针对业务比较复杂的场景,建议保证业务完整性的情况下,尽量拆分页面,不要在一个页面放置太多业务。比如若在一个Page页面内使用Swiper实现多页面切换的效果,那么会导致该页面加载过多组件,业务过重。这时建议如图4所示,在js->default->pages目录下新建JS page,将不同业务拆分为多个页面进行显示。

(图4)

根据实际业务场景来进行组件和代码优化,在此以一个实际例子来说明。

(图5)

如图5所示,要在APP中显示时间,但是手表只支持30和38两种字体大小,笔者便通过贴图的方式来实现设计效果,实现代码如下图6所示:
(图6)
通过for属性,创建5个image,每个image绑定一张图片来实现时间的显示效果。实际上该段代码中共5个image、6个动态绑定,但是第三个image是固定的,不需要动态绑定。基于这点,我们可以进行代码优化,修改后的代码如图7所示:
(图7)
修改后减少了两个动态绑定。虽然和修改前的代码相比,代码可读性和美观性有所下降,但是这样可以有效减少内存的占用。
总结一下优化代码的解决方案包括但不限于:
①将一个Page拆分为多个Page,减少页面运行时需加载的内容;
②减少for循环属性的使用降低动态绑定时的内存消耗;
③用简单组件来替换复杂的组件,比如某些情况下可以用div来代替progress,用list或者div扩展页面来实现类似swiper的滑动效果等等;
④使用if属性而非show属性,当组件不需要显示时会移除组件避免浪费内存;
⑤尽可能避免使用大数组和多层嵌套数组;

总的来说,内存优化的过程中,一定要结合具体业务来确认优化点,减少不必要的控件和属性使用,适当拆分复杂业务,就能有效控制内存的使用情况啦~

END

(0)

相关推荐