HarmonyOS 鸿蒙Next IDataSource的onDatasetChange()崩溃

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next IDataSource的onDatasetChange()崩溃

IDataSource的onDatasetChange()崩溃

Error message:onDatasetChange cannot be used with other interface

SourceCode:
listener.onDatasetChange([{ type: DataOperationType.DELETE, index: index, count: count }]);

咨询场景描述:
this.cellList.deleteDataArray(17,6)

this.dataArray.splice(index, deleteCount);
this.notifyDataDelete(index, deleteCount);

this.listeners.forEach(listener => {
// listener.onDataDelete(index);
listener.onDatasetChange([{ type: DataOperationType.DELETE, index: index, count: count }]);
})


更多关于HarmonyOS 鸿蒙Next IDataSource的onDatasetChange()崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在下面的代码中把BasicDataSource里面的所有的操作,都改成onDatasetChange操作类型的,不要使用类似这种listener.onDataDelete(index)

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
 private data: MyDataSource = new MyDataSource();

 setName() {
   const num: number = Math.random()
   if (num > 0.5) {
     return '这个名字很长'
   } else {
     return '短名字'
   }
 }

 aboutToAppear() {
   for (let i = 0; i <= 10; i++) {
     this.data.pushData(new userInfo($r('app.media.startIcon'), this.setName()))
   }
 }

 [@Builder](/user/Builder)
 setUser(item: userInfo) {
   Column({ space: 15 }) {
     Image(item.imgUrl).width(60).borderRadius(30)
     Text(item.name).fontSize(16).maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
   }.width(100).onAppear(() => {
     console.log('is aaa')
   })
 }

 build() {
   Column() {
     List({ space: 5 }) {
       LazyForEach(this.data, (item: userInfo, index: number) => {
         ListItem() {
           this.setUser(item)
         }
       }, (item: userInfo, index: number) => item.name + index)
     }
     .width('100%')
     .height(115)
     .listDirection(Axis.Horizontal)
     .scrollBar(BarState.On)
     .cachedCount(5)
   }.margin({ top: 20 })
 }
}

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

 public totalCount(): number {
   return 0;
 }

 public getData(index: number): userInfo {
   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);
     // 写法2:
     // listener.onDatasetChange([ {type: DataOperationType.ADD, index: index} ]);
     listener.onDatasetChange([{ type: DataOperationType.DELETE, index: 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: userInfo[] = [];

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

 public getData(index: number): userInfo {
   return this.dataArray[index];
 }

 public addData(index: number, data: userInfo): void {
   this.dataArray.splice(index, 0, data);
   this.notifyDataAdd(index);
 }

 public pushData(data: userInfo): void {
   this.dataArray.push(data);
   this.notifyDataAdd(this.dataArray.length - 1);
 }
}

class userInfo {
 imgUrl: Resource = $r('app.media.app_icon')
 name: string = ''

 constructor(imgUrl: Resource, name: string) {
   this.imgUrl = imgUrl
   this.name = name
 }
}

更多关于HarmonyOS 鸿蒙Next IDataSource的onDatasetChange()崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的HarmonyOS鸿蒙系统中Next IDataSource的onDatasetChange()方法崩溃问题,这通常与数据更新处理不当或内存管理问题有关。以下是一些可能的解决方向,供您参考:

  1. 检查数据源更新逻辑:确保在onDatasetChange()中处理的数据源更新逻辑是安全的,避免在更新过程中访问无效或已被释放的资源。

  2. 内存泄漏检查:使用内存分析工具检查是否存在内存泄漏,特别是与数据更新相关的对象。内存泄漏可能导致应用内存不足,进而引发崩溃。

  3. 异常捕获:在onDatasetChange()中添加适当的异常捕获逻辑,以便在出现错误时能够优雅地处理,而不是直接崩溃。

  4. 线程安全:如果onDatasetChange()在多线程环境下被调用,确保数据访问是线程安全的。使用同步机制或线程安全的集合来避免数据竞争。

  5. 日志记录:增加日志记录,特别是在onDatasetChange()的入口和关键操作点,以便在崩溃后能够定位问题发生的原因。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。希望这些信息对您有所帮助!

回到顶部