HarmonyOS 鸿蒙Next startupTask的init函数里使用await为什么会超时?

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

HarmonyOS 鸿蒙Next startupTask的init函数里使用await为什么会超时? 在startupTask里设置启动任务,init函数里使用await让任务串行执行,但是return之后,任务还没结束,导致任务超时,始终进不了下一个任务,下一个任务也接收不了这个任务的返回值

图片

图片

从日志可以看到,return的上一条hilog已经打印了,也就是代码都执行完毕了,但是任务还没结束,即使去掉return语句,任务也会超时。

有哪位大佬可以指导一下启动任务该怎么顺序执行,同时也可以传递数据?


更多关于HarmonyOS 鸿蒙Next startupTask的init函数里使用await为什么会超时?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

这边的意思是init执行完了,还有其他任务吗?能否提供个详细的demo?最好是文本的格式。

更多关于HarmonyOS 鸿蒙Next startupTask的init函数里使用await为什么会超时?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


@Sendable export default class CreateDB extends StartupTask { constructor() { super() }

async init(context: common.AbilityStageContext): Promise<void | Object> { hilog.info(0x0000, ‘testTag’, ‘CreateDB init.’); const storeConfig: relationalStore.StoreConfig = { name: ‘bills.db’, securityLevel: relationalStore.SecurityLevel.S4, encrypt: true, customDir: ‘bill’, allowRebuild: true }

let rdbStore = await relationalStore.getRdbStore(context, storeConfig)
if (rdbStore) {
  hilog.info(0x0000, 'testTag', `Succeeded in getting RdbStore. Version = ${rdbStore.version}`)
}
await this.createTable(rdbStore)
return rdbStore

}

async createTable(rdbStore?: relationalStore.RdbStore): Promise<void> { hilog.info(0x0000, ‘testTag’, Succeeded in getting RdbStore.)

const SQL_CREATE_BILLS =
  'CREATE TABLE IF NOT EXISTS BILLS (ID INTEGER PRIMARY KEY AUTOINCREMENT, COST REAL NOT NULL, PAY_APP TEXT NOT NULL, PAY_ACCOUNT TEXT NOT NULL, CLASSIFICATION TEXT NOT NULL, CREATE_TIME DATETIME NOT NULL, PAY_TIME DATETIME NOT NULL, YEAR INTEGER NOT NULL, MONTH INTEGER NOT NULL, DAY INTEGER NOT NULL, NOTES TEXT);'
const SQL_CREATE_CLASSIFICATION =
  'CREATE TABLE IF NOT EXISTS CLASSIFICATION (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT UNIQUE NOT NULL);'
const SQL_CREATE_PAY_APP =
  'CREATE TABLE IF NOT EXISTS PAY_APP (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT UNIQUE NOT NULL);'
const SQL_CREATE_PAY_ACCOUNT =
  'CREATE TABLE IF NOT EXISTS PAY_ACCOUNT (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT UNIQUE NOT NULL, AMOUNT REAL NOT NULL DEFAULT 0);'
// 当数据库创建时,数据库默认版本为0
if (rdbStore && rdbStore.version === 0) {
  await rdbStore.executeSql(SQL_CREATE_BILLS)
  hilog.info(0x0000, 'testTag', `go to excuteSql`)
  await rdbStore.executeSql(SQL_CREATE_CLASSIFICATION) // 创建数据表
  await rdbStore.executeSql(SQL_CREATE_PAY_APP)
  await rdbStore.executeSql(SQL_CREATE_PAY_ACCOUNT)
  // 设置数据库的版本,入参为大于0的整数
  rdbStore.version = 1
}
return

} }

看日志是代码执行完了,想把rdbStore传递到下一个任务继续执行读表的操作,或者不传递,只在页面初始之前完成建表和读表的操作,但是发现好像只要await在init里面,任务就会超时,如果不用await的话,可能页面已经初始化了,还没有完成读表操作,这好像是个冲突,

你可以试着把建表操作放到entryAbility里面执行,应用首次启动创建好。

在HarmonyOS(鸿蒙)系统中,如果在startupTaskinit函数里使用await导致超时,可能的原因包括但不限于以下几点:

  1. 任务调度延迟:startupTaskinit函数通常在系统启动或应用启动时执行,此时系统可能还在进行其他关键任务的调度,导致await等待的操作被延迟处理。

  2. 资源竞争:如果await等待的是某个资源或服务的响应,而该资源或服务正被其他高优先级任务占用,可能会导致超时。

  3. 异步操作未完成:await通常用于等待异步操作的完成。如果异步操作本身存在问题,如网络请求失败、数据库查询超时等,也会导致await超时。

  4. 系统限制:鸿蒙系统可能对某些异步操作有特定的时间限制,超过该限制则触发超时。

  5. 代码逻辑错误:检查await的使用是否正确,以及被等待的异步操作是否已正确启动和处理。

针对这些问题,可以尝试优化任务调度策略、减少资源竞争、确保异步操作正确执行等方法进行排查和解决。但具体解决方案需根据实际场景和代码逻辑进行调整。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部