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 知识分享

  • 数据未加载完成时,应该先布局加载动画进行过渡

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐