HarmonyOS 鸿蒙Next taskpool执行封装的数据库语句报错

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

HarmonyOS 鸿蒙Next taskpool执行封装的数据库语句报错

某个方法单独执行数据库语句没啥问题 ,如果把他放到在taskpool.execute就会报错,获取不到数据库的rdbstore
是因为初始化的rdbstore跟taskpool不在一个线程的原因么?

2 回复

rdbstore是否和taskpool不在一个线程内,有没有类似数据共享 加锁能解决 线程间通信 ,有没有全局的context 能在线程里获取到

线程之间的参数传递当前支持通过sendable参数传递

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/sendable-object-V5

五月份以后会支持sendable单例,单例就是说不需要作为参数进行传递,可以关注下后续的鸿蒙指导文档。

另外,线程之间之前的其他通信手段:

worker线程和worker线程之间,用emitter:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/itc-with-emitter-V5

宿主线程与worker线程之间:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/sync-task-development-V5还有Task向主线程中发送即时消息

如果一个Task,不仅需要返回最后的执行结果,而且需要定时通知主线程状态、数据的变化,或者需要分段返回数量级较大的数据(比如从数据库中读取大量数据),可以通过下面这种方式实现。

首先,实现一个方法,用来接收Task发送的消息。

//code/Performance/PerformanceLibrary/feature/ThreadCommunication/src/main/ets/pages/TaskSendDataUsage.ets
function notice(data: number): void {

console.log("子线程任务已执行完,共加载图片: ", data);

}

然后,在Task需要执行的任务中,添加sendData()接口将消息发送给主线程。

//code/Performance/PerformanceLibrary/feature/ThreadCommunication/src/main/ets/pages/TaskSendDataUsage.ets

// 通过Task的sendData方法,即时通知主线程信息

@Concurrent

export function loadPictureSendData(count: number): IconItemSource[] {

let iconItemSourceList: IconItemSource[] = [];

// 遍历添加6*count个IconItem的数据

for (let index = 0; index < count; index++) {

const numStart: number = index * 6;

// 此处循环使用6张图片资源

iconItemSourceList.push(new IconItemSource($r('app.media.nearby'), `item${numStart + 1}`));

iconItemSourceList.push(new IconItemSource($r('app.media.scan'), `item${numStart + 2}`));

iconItemSourceList.push(new IconItemSource($r('app.media.shop'), `item${numStart + 3}`));

iconItemSourceList.push(new IconItemSource($r('app.media.cards'), `item${numStart + 4}`));

iconItemSourceList.push(new IconItemSource($r('app.media.album'), `item${numStart + 5}`));

iconItemSourceList.push(new IconItemSource($r('app.media.applet'), `item${numStart + 6}`));

taskpool.Task.sendData(iconItemSourceList.length);

}

return iconItemSourceList;

}

最后,在主线程通过onReceiveData()接口接收消息。

//code/Performance/PerformanceLibrary/feature/ThreadCommunication/src/main/ets/pages/TaskSendDataUsage.ets

......

let lodePictureTask: taskpool.Task = new taskpool.Task(loadPictureSendData, 30);

// 设置notice方法接收Task发送的消息

lodePictureTask.onReceiveData(notice);

taskpool.execute(lodePictureTask).then((res: IconItemSource[]) => {

this.iconItemSourceList = res;

})

......

这样主线程就可以通过notice()接口接收到Task发送的数据。

针对您提到的HarmonyOS鸿蒙系统中Next taskpool执行封装的数据库语句报错的问题,这通常可能由几个原因引起:

  1. 线程安全性:确保您的数据库操作代码是线程安全的。在HarmonyOS的多线程环境中,如果数据库操作不是线程安全的,可能会导致数据不一致或报错。

  2. 权限问题:检查您的应用是否已正确配置并授予了访问数据库的权限。权限不足也可能导致执行数据库语句时出错。

  3. SQL语句错误:验证封装的SQL语句是否正确无误。错误的SQL语法或逻辑错误都会导致执行失败。

  4. 资源竞争:在并发环境下,可能存在多个线程同时尝试访问或修改同一数据库资源的情况,这可能导致资源竞争和冲突。

  5. Taskpool配置:检查Next taskpool的配置是否正确,包括线程数、任务队列大小等,确保它们符合您的应用需求。

解决这类问题通常需要具体分析错误日志和代码。如果上述检查均未能解决问题,建议详细查看错误日志,查找具体的错误信息或异常代码,以便进一步定位问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部