鸿蒙(HarmonyOS)性能优化实战-多板块性能提升方案

往期知识点整理

开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行,但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考,以避免应用实现上带来的性能劣化。

使用数据懒加载

开发者在使用长列表时,如果直接采用循环渲染方式,如下所示,会一次性加载所有的列表元素,一方面会导致页面启动时间过长,影响用户体验,另一方面也会增加服务器的压力和流量,加重系统负担。

@Entry
@Component
struct MyComponent {
   
   
  @State arr: number[] = Array.from(Array<number>(100), (v:number,k:number) =>k);  //构造0-99的数组
  build() {
   
   
    List() {
   
   
      ForEach(this.arr, (item: number) => {
   
   
        ListItem() {
   
   
          Text(`item value: ${
     
     item}`)
        }
      }, (item: number) => item.toString())
    }
  }
}

上述代码会在页面加载时将100个列表元素全部加载,这并非我们需要的,我们希望从数据源中按需迭代加载数据并创建相应组件,因此需要使用数据懒加载,如下所示:

class BasicDataSource implements IDataSource {
   
   
  private listeners: DataChangeListener[] = [];
  private originDataArray: string[] = [];

  public totalCount(): number {
   
   
    return 0;
  }

  public getData(index: number): string {
   
   
    return this.originDataArray[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
   
   
    if (this.listeners.indexOf(listener) < 0) {
   
   
      console.info('add listener');
      this.listeners.push(listener);
    }
  }

  unregisterDataChangeListener(listener: DataChangeListener): void {
   
   
    const pos = this.listeners.indexOf(listener);
    if (pos >= 0) {
   
   
      console.info('remove listener');
      this.listeners.splice(pos, 1);
    }
  }

  notifyDataReload(): void {
   
   
    this.listeners.forEach(listener => {
   
   
      listener.onDataReloaded();
    })
  }

  notifyDataAdd(index: number): void {
   
   
    this.listeners.forEach(listener => {
   
   
      listener.onDataAdd(index);
    })
  }

  notifyDataChange(index: number): void {
   
   
    this.listeners.forEach(listener => {
   
   
      listener.onDataChange(index);
    })
  }

  notifyDataDelete(index: number): void {
   
   
    this.listeners.forEach(listener => {
   
   
      listener.onDataDelete(index);
    })
  }

  notifyDataMove(from: number, to: number): void {
   
   
    this.listeners.forEach(listener => {
   
   
      listener.onDataMove(from, to);
    })
  }
}

class MyDataSource extends BasicDataSource {
   
   
  private dataArray: string[] = ['item value: 0', 'item value: 1', 'item value: 2'];

  public totalCount(): number {
   
   
    return this.dataArray.length;
  }

  public getData(index: number): stri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值