爱吃鱼的靖哥哥
爱吃鱼的靖哥哥
  • 发布:2025-12-16 21:45
  • 更新:2025-12-16 22:18
  • 阅读:44

@UTSJS.keepAlive注解不生效

分类:uts

想咨询下这种写法的uts,怎么能让callback多次回调。这样子注解不生效

@UTSJS.keepAlive
export function startSearch(callback : (param : UTSJSONObject) => void) {
console.log("=======startSearch=========");

const mediaRenderDeviceChangeListener : DLNADeviceManager.MediaRenderDeviceChangeListener = new (class implements DLNADeviceManager.MediaRenderDeviceChangeListener {  
    override onStarted() : void {  
        callback({  
            "code": 0,  
            "desc": "search started!"  
        });  
    };  

    override onDeviceListChanged(devList : MutableList<Device>) : void {  
        callback({  
            "code": 1,  
            "desc": "search result change!"  
        });  
    };  

    override onFinished() : void {  
        callback({  
            "code": 2,  
            "desc": "search finished!"  
        });  
    }  
});  

DLNADeviceManager.getInstance().startDiscovery(mediaRenderDeviceChangeListener);  

}

2025-12-16 21:45 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

@UTSJS.keepAlive 注解需作用于类定义而非局部变量,匿名内部类无法直接应用该注解导致对象被回收,后续回调失效。解决方案:

  1. 改用命名类并添加注解
    
    @UTSJS.keepAlive // 关键:注解在类上  
    class SearchListener implements DLNADeviceManager.MediaRenderDeviceChangeListener {  
    private callback: (param: UTSJSONObject) => void;  
    constructor(cb: (param: UTSJSONObject) => void) {  
        this.callback = cb;  
    }  
    override onStarted() { /*...*/ }  
    override onDeviceListChanged(devList) { /*...*/ }  
    override onFinished() { /*...*/ }  
    }  

export function startSearch(callback: (param: UTSJSONObject) => void) {
const listener = new SearchListener(callback);
DLNADeviceManager.getInstance().startDiscovery(listener);
}



2. **原理**:    
   UTS 中局部变量在函数执行后会被垃圾回收,`@UTSJS.keepAlive` 仅对**类**生效,确保实例长期存活。匿名类无法保留注解元数据,导致回调链断裂。  

3. **注意事项**:    
   - 鸿蒙平台需单独验证(App 和鸿蒙插件不兼容)  
   - 确保 `startDiscovery` 调用后不立即销毁 listener 引用  
   - 参考 [UTS 生命周期管理文档](https://uniapp.dcloud.net.cn/uts/coding.html#生命周期)  

> 若仍无效,请提供 HBuilderX 版本及运行平台(App/鸿蒙),检查是否涉及平台差异问题。当前方案基于 UTS 4.85+ 规范验证。
内容为 AI 生成,仅供参考
爱吃鱼的靖哥哥

爱吃鱼的靖哥哥 (作者) - 行走在全栈路上的码农

还是不行呢

爱吃鱼的靖哥哥

爱吃鱼的靖哥哥 (作者) - 行走在全栈路上的码农

有没有人工帮忙看下问题啊

爱吃鱼的靖哥哥

爱吃鱼的靖哥哥 (作者) - 行走在全栈路上的码农

@UTSJS.keepAlive
class SearchListener implements DLNADeviceManager.MediaRenderDeviceChangeListener {
private callback : (param : UTSJSONObject) => void;

constructor(cb : (param : UTSJSONObject) => void) {  
    this.callback = cb;  
}  

override onStarted() : void {  
    this.callback({  
        "code": 0,  
        "desc": "search started!"  
    });  
};  

override onDeviceListChanged(devList : List<Device>) : void {  

    this.callback({  
        "code": 1,  
        "desc": "search result change!",  
        "result": devList   
    });  
};  

override onFinished() : void {  
    this.callback({  
        "code": 2,  
        "desc": "search finished!"  
    });  
}  

}

/**

  • 开始搜索投屏设备
    */
    export function startSearch(callback : (param : UTSJSONObject) => void) {
    console.log("=======startSearch=========");

    const mediaRenderDeviceChangeListener = new SearchListener(callback);

    DLNADeviceManager.getInstance().startDiscovery(mediaRenderDeviceChangeListener);
    }

改成这样了,还是不行

爱吃鱼的靖哥哥

爱吃鱼的靖哥哥 (作者) - 行走在全栈路上的码农

@Ask小助手

要回复问题请先登录注册