HarmonyOS 鸿蒙Next 使用 ohos net connection (网络连接管理)进行register后 再unregister 应用会卡死

HarmonyOS 鸿蒙Next 使用 ohos net connection (网络连接管理)进行register后 再unregister 应用会卡死

使用@ohos.net.connection (网络连接管理)进行register后,再unregister,应用会卡死

咨询场景描述:

private reachabilityChanged() {
    let isRegisterApp: boolean = false
    let netSpecifier: connection.NetSpecifier = {
        netCapabilities: {
            // 假设当前默认网络是WiFi,需要创建蜂窝网络连接,可指定网络类型为蜂窝网
            bearerTypes: [connection.NetBearType.BEARER_CELLULAR, connection.NetBearType.BEARER_WIFI],
            // 指定网络能力为Internet
            networkCap: [connection.NetCap.NET_CAPABILITY_INTERNET]
        },
    };
    // 指定超时时间为10s(默认值为0)
    let timeout = 10 * 1000;
    // 创建NetConnection对象
    let conn = connection.createNetConnection(netSpecifier, timeout);
    // 订阅事件,如果当前指定网络可用,通过on_netAvailable通知用户
    conn.on('netAvailable', ((data: connection.NetHandle) => {
        console.info("当前指定网络可用" + data.netId);
        if (!isRegisterApp) {
            isRegisterApp = true
            this.reachabilityChangedImp(10 * 1000)
            // 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅
            conn.unregister((err: BusinessError, data: void) => {
                console.info("注销网络" + JSON.stringify(data));
            });
        }
    }));
    // 订阅事件,如果当前指定网络不可用,通过on_netUnavailable通知用户
    conn.on('netUnavailable', ((data: void) => {
        console.info("当前指定网络不可用" + JSON.stringify(data));
    }));
    // 订阅指定网络状态变化的通知
    conn.register((err: BusinessError, data: void) => {
        console.info("网络状态变化通知" + JSON.stringify(data));
    });
}

private async reachabilityChangedImp(time: number): Promise<void> {
    setTimeout(() => {
        this.sendLaunchEventData('')
    }, time)
}

更多关于HarmonyOS 鸿蒙Next 使用 ohos net connection (网络连接管理)进行register后 再unregister 应用会卡死的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

当前模块使用需要先开启register订阅指定网络状态再进行netAvailable等事件监听网络连接状态,可尝试将conn设置为全局变量部分

let conn = connection.createNetConnection(netSpecifier, timeout);
private reachabilityChanged() {
    let isRegisterApp:boolean=false // 指定超时时间为10s(默认值为0)
    let timeout = 10 * 1000;
    // 订阅指定网络状态变化的通知
    conn.register((err: BusinessError, data: void) => {
        console.info("网络状态变化通知" + JSON.stringify(data));
    });
    // 订阅事件,如果当前指定网络可用,通过on_netAvailable通知用户
    conn.on('netAvailable', ((data: connection.NetHandle) => {
        console.info("当前指定网络可用" + data.netId);
        if (!isRegisterApp) {
            isRegisterApp = true
            this.reachabilityChangedImp(10 * 1000)
            // 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅
            conn.unregister((err: BusinessError, data: void) => {
                console.info("注销网络" + JSON.stringify(data));
            });
        }
    }));
    // 订阅事件,如果当前指定网络不可用,通过on_netUnavailable通知用户
    conn.on('netUnavailable', ((data: void) => {
        console.info("当前指定网络不可用" + JSON.stringify(data));
    }));
    conn.unregister((err: BusinessError, data: void) => {
        console.info("注销网络" + JSON.stringify(data));
    });
}

更多关于HarmonyOS 鸿蒙Next 使用 ohos net connection (网络连接管理)进行register后 再unregister 应用会卡死的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next系统中使用ohos.net.connection(网络连接管理)进行register(注册)后再unregister(注销)导致应用卡死的问题,可能的原因及解决方案如下:

该问题可能由于网络连接管理模块在处理register和unregister操作时存在资源未正确释放或状态同步问题。在unregister过程中,如果相关资源或状态未能正确清理或重置,可能会导致应用进程陷入等待状态,从而引发卡死现象。

为解决此问题,可尝试以下步骤:

  1. 确保unregister调用正确:检查unregister的调用时机和参数是否正确,确保在不再需要网络连接时调用,并避免重复调用。

  2. 检查网络连接状态:在unregister之前,确认网络连接是否已正确关闭或断开,避免在仍有活动连接时注销。

  3. 资源清理:在unregister后,确保所有与网络连接相关的资源(如线程、句柄等)都已正确清理,避免资源泄露导致的问题。

  4. 异常处理:增加异常处理逻辑,捕获并处理unregister过程中可能出现的异常,确保应用能够优雅地处理错误情况。

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

回到顶部