HarmonyOS 鸿蒙Next 异步代码回调之后,变量赋值异常
HarmonyOS 鸿蒙Next 异步代码回调之后,变量赋值异常
代码如下:
import { JYSLSDK, JYSLError, LogUtils, RoleData, RoleDataType, OrderData } from '@ohos/DcGameLib';
import common from '@ohos.app.ability.common';
import { window } from '@kit.ArkUI';
import promptAction from '@ohos.promptAction';
export class SDKClass {
public static m_InitComplete = false;
public static m_strPostURL = ""
public static m_ClientVer = ""
//初始化
public static Init(context: common.UIAbilityContext, windowStage: window.WindowStage): void {
JYSLSDK.getInstance().init(context, windowStage).then(() => {
SDKClass.m_InitComplete = true
console.log("初始化成功")
promptAction.showToast({
message: "初始化成功", duration: 1500, bottom: '200vp'
})
}).catch((err: JYSLError) => {
console.log("初始化失败00")
SDKClass.m_InitComplete = true
promptAction.showToast({
message: "初始化失败", duration: 1500, bottom: '200vp'
})
});
}
//登录
public static Login(): void {
//登录接口
if(SDKClass.m_InitComplete)
{
LogUtils.info("m_InitComplete true")
}
else
{
LogUtils.info("m_InitComplete false")
}
}
}
我确认Init方法回调执行过后(不管成功还是失败都将SDKClass.m_InitComplete赋值为true),再调用Login方法,SDKClass.m_InitComplete竟然没有发生改变依然是false,请问这是什么情况?
更多关于HarmonyOS 鸿蒙Next 异步代码回调之后,变量赋值异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
因为你没有创建SDKClass 的实例,建议使用单例模式改造代码,示例如下:
import { JYSLSDK, JYSLError, LogUtils, RoleData, RoleDataType, OrderData } from '@ohos/DcGameLib';
import common from '@ohos.app.ability.common';
import { window } from '@ohos.arkui';
import promptAction from '@ohos.promptAction';
class SDKClass {
private static instance: SDKClass | null = null;
private m_InitComplete = false;
private m_strPostURL = "";
private m_ClientVer = "";
// 私有化构造函数
private constructor() {}
// 静态方法获取实例
public static getInstance(): SDKClass {
if (!SDKClass.instance) {
SDKClass.instance = new SDKClass();
}
return SDKClass.instance;
}
// 初始化
public init(context: common.UIAbilityContext, windowStage: window.WindowStage): Promise<void> {
return new Promise((resolve, reject) => {
JYSLSDK.getInstance().init(context, windowStage).then(() => {
this.m_InitComplete = true;
console.log("初始化成功");
promptAction.showToast({
message: "初始化成功", duration: 1500, bottom: '200vp'
});
resolve();
}).catch((err: JYSLError) => {
console.log("初始化失败00");
this.m_InitComplete = false; // 初始化失败时,m_InitComplete应为false
promptAction.showToast({
message: "初始化失败", duration: 1500, bottom: '200vp'
});
reject(err);
});
});
}
// 登录
public login(): void {
if (this.m_InitComplete) {
LogUtils.info("m_InitComplete true");
// 执行登录逻辑
} else {
LogUtils.info("m_InitComplete false");
}
}
}
// 使用示例
const sdkInstance = SDKClass.getInstance();
sdkInstance.init(context, windowStage).then(() => {
sdkInstance.login();
}).catch((err) => {
console.log("初始化失败,无法登录", err);
});
更多关于HarmonyOS 鸿蒙Next 异步代码回调之后,变量赋值异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
试过了单例模式依然是错误的,我之前代码中的m_InitComplete 定义的是一个static,Arkts中的static变量难道不能直接赋值使用吗
嗯 static确实可以,那就是异步代码导致,就像示例的最下面,我将login的执行放在了init的回调中,确保m_InitComplete 正确赋值,
保证异步代码 init()方法执行完毕后,再去调用login方法,不然会出现调用了login(),实际init可能还在耗时执行
在HarmonyOS鸿蒙Next系统中,异步代码回调后出现变量赋值异常的情况,通常是由于异步回调执行时,原变量的作用域或生命周期已发生变化所导致。
在鸿蒙系统的异步编程模型中,回调函数往往是在主线程之外的其他线程执行的。如果在异步回调中直接访问或修改主线程中的局部变量,可能会因为该变量在回调执行时已超出作用域或已被回收,导致未定义行为或程序崩溃。
为了解决这个问题,可以考虑以下几种方法:
-
使用全局变量或类成员变量:将需要修改的变量定义为全局变量或类的成员变量,确保在异步回调执行时,该变量仍然有效。
-
使用智能指针或引用计数:对于复杂的对象,可以使用智能指针或引用计数来管理对象的生命周期,确保在异步回调执行时对象仍然存活。
-
使用线程安全的容器或锁:如果多个线程可能同时访问或修改同一个变量,需要使用线程安全的容器或锁来避免数据竞争。
如果以上方法仍然无法解决问题,可能是由于其他潜在的问题导致的,如内存泄漏、线程死锁等。此时,建议仔细检查代码逻辑,并使用调试工具进行逐步排查。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html,