settings应用管理页面卡顿问题分析报告
1 关键字 Settings;应用管理 2 问题描述 开发板型号:rk3568 内核版本: 3.1release 问题现象: 反复进入应用管理,滑动应用列表时,出现明显卡顿 测试步骤: 打开设置->应用,反复进入应用管理,滑动应用列表时,出现明显卡顿 3 问题原因 3.1 正常机制 每次进入应用管理页面时会有一个加载动画,待数据加载完成后展示应用列表,此时上下滑动不会出现卡顿 3.2 异常机制 进
1 关键字
Settings;应用管理
2 问题描述
开发板型号:rk3568
内核版本: 3.1release
问题现象:
-
反复进入应用管理,滑动应用列表时,出现明显卡顿
测试步骤:
-
打开设置->应用,反复进入应用管理,滑动应用列表时,出现明显卡顿
3 问题原因
3.1 正常机制
-
每次进入应用管理页面时会有一个加载动画,待数据加载完成后展示应用列表,此时上下滑动不会出现卡顿
3.2 异常机制
-
进入应用管理没有加载动画,直接展示应用列表,此时上下滑动出现明显卡顿
4 解决方案
1、在社区下载settings 3.1release分支应用(下载链接:https://gitee.com/openharmony/applications_settings/tree/OpenHarmony-3.1-Release/)
2、将product/phone/src/main/ets/MainAbility/pages/appManagement.ets里面的aboutToDisappear()方法中的"AppStorage.Delete('appManagementList');"改成"AppStorage.Set("appManagementList", []);"
aboutToDisappear(): void{
LogUtil.info('settings AppManagement aboutToDisappear in');
//AppStorage.Delete('appManagementList');
AppStorage.Set("appManagementList", []);
LogUtil.info('settings AppManagement aboutToDisappear out');
}
3、编译、打包、安装即可
5 定位过程
-
1、根据异常情况进入应用管理页面没有加载动画,判断加载动画的渲染条件出现问题;
-
2、加载动画的渲染条件是由应用列表的长度控制的;当应用列表长度大于0(应用列表有数据)时,加载动画是隐藏的;反之,则需要渲染
//应用列表
@StorageLink('appManagementList') appList: any[] = [];
... ...
Column() {
ImageAnimatorComponent({ imageWidth: $r('app.float.wh_value_80'), imageHeight: $r('app.float.wh_value_80'), whtl: this.whtl });
}
.zIndex(1)
//渲染动画的条件
.visibility(this.appList.length > 0 ? Visibility.None : Visibility.Visible)
.align(Alignment.Center)
.padding({ top: ConfigData.WH_35_100 })
.width(ConfigData.WH_100_100)
.height(ConfigData.WH_100_100);
-
3、在aboutToDisappear方法里面调用删除应用列表的方法,但是通过日志发现该方法并未执行成功;
aboutToDisappear(): void{
LogUtil.info('settings AppManagement aboutToDisappear in');
//当退出应用管理页面时,应该删除应用管理列表
let result = AppStorage.Delete('appManagementList');
console.log(`---><--- aboutToDisappear AppStorage.Delete result:${JSON.stringify(result)}`);
LogUtil.info('settings AppManagement aboutToDisappear out');
}
08-06 08:49:23.385 1690 1701 D 03b00/JSApp: app Log: ---><--- aboutToDisappear AppStorage.Delete result: false
-
4、尝试将Delete方法改成Set方法将应用列表清空,通过日志发现Set方法可以执行成功(清空应用列表),再进入应用管理页面时,加载动画会渲染,滑动应用列表没有卡顿出现
aboutToDisappear(): void{
LogUtil.info('settings AppManagement aboutToDisappear in');
//let result = AppStorage.Delete('appManagementList');
//将Delete方法更换成Set方法,并赋予空数组
let result = AppStorage.Set("appManagementList", []);
console.log(`---><--- aboutToDisappear AppStorage.Set result: ${JSON.stringify(result)}`);
LogUtil.info('settings AppManagement aboutToDisappear out');
}
08-06 08:59:37.471 1710 1721 D 03b00/JSApp: app Log: ---><--- aboutToDisappear AppStorage.Set result: true
结论:由于APPStorage.Delete()方法执行失败,导致应用列表数据没清空,所以加载动画不会渲染而直接进入应用列表展示,此时真实的应用列表数据还未加载完成,上下滑动会出现明显卡顿
6 知识分享
-
数据未加载完成时,应该先布局加载动画进行过渡
更多推荐
所有评论(0)