HarmonyOS 鸿蒙Next 异步代码回调之后,变量赋值异常

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

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

5 回复

因为你没有创建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系统中,异步代码回调后出现变量赋值异常的情况,通常是由于异步回调执行时,原变量的作用域或生命周期已发生变化所导致。

在鸿蒙系统的异步编程模型中,回调函数往往是在主线程之外的其他线程执行的。如果在异步回调中直接访问或修改主线程中的局部变量,可能会因为该变量在回调执行时已超出作用域或已被回收,导致未定义行为或程序崩溃。

为了解决这个问题,可以考虑以下几种方法:

  1. 使用全局变量或类成员变量:将需要修改的变量定义为全局变量或类的成员变量,确保在异步回调执行时,该变量仍然有效。

  2. 使用智能指针或引用计数:对于复杂的对象,可以使用智能指针或引用计数来管理对象的生命周期,确保在异步回调执行时对象仍然存活。

  3. 使用线程安全的容器或锁:如果多个线程可能同时访问或修改同一个变量,需要使用线程安全的容器或锁来避免数据竞争。

如果以上方法仍然无法解决问题,可能是由于其他潜在的问题导致的,如内存泄漏、线程死锁等。此时,建议仔细检查代码逻辑,并使用调试工具进行逐步排查。

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

回到顶部