uni-app 【报Bug】plus.device.getOAID 导致 plus.nativeUI.previewImage 安卓黑屏

uni-app 【报Bug】plus.device.getOAID 导致 plus.nativeUI.previewImage 安卓黑屏

开发环境 版本号 项目创建方式
HBuilderX 3.2.15 云端

APP 启动后 执行两次或以上 plus.device.getOAID plus.nativeUI.previewImage 会出现黑屏,放置几分钟图片又能自己出来。

可复现代码

<!DOCTYPE html>  
<html>  
    <script src="js/mui.min.js"></script>  
    <script>  
        mui.init();  
        mui.plusReady(function ()   
        {  
            // 调用 OAID 超过 1 次(两次或以上)  
            for (var i=0; i<2; i++) {  
                plus.device.getOAID({  
                    success: function(e) {  
                        console.log(e.oaid);  
                    }  
                });  
            }  

            // 预览图片就会黑屏  
            plus.nativeUI.previewImage([  
                "http://img-cdn-qiniu.dcloud.net.cn/newpage/images/logo4.png"  
            ]);  
        })  
    </script>  
</html>

更多关于uni-app 【报Bug】plus.device.getOAID 导致 plus.nativeUI.previewImage 安卓黑屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 【报Bug】plus.device.getOAID 导致 plus.nativeUI.previewImage 安卓黑屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的异步任务冲突问题。plus.device.getOAID() 在安卓平台会启动一个独立的 WebView 子线程来获取设备标识,而 plus.nativeUI.previewImage() 同样依赖原生图片组件。当短时间内连续调用 getOAID() 时,其创建的线程可能尚未完全释放,与后续 previewImage() 的原生窗口渲染产生资源竞争,导致图片容器渲染异常(黑屏)。一段时间后系统自动回收冲突资源,图片得以显示。

临时解决方案:

  1. 避免重复调用:应用启动后仅获取一次 OAID 并缓存,切勿在循环或短时间内多次调用。
  2. 增加延迟:在 getOAID() 调用后,使用 setTimeout 延迟至少 500ms 再执行 previewImage()
  3. 使用条件规避:在需要预览图片的页面或逻辑中,跳过 OAID 的重复获取。

修改示例:

let oaidCache = null;
mui.plusReady(function() {
    // 仅获取一次 OAID
    if (!oaidCache) {
        plus.device.getOAID({
            success: function(e) {
                oaidCache = e.oaid;
                console.log('OAID cached:', oaidCache);
            }
        });
    }
    
    // 延迟预览图片
    setTimeout(() => {
        plus.nativeUI.previewImage([
            "http://img-cdn-qiniu.dcloud.net.cn/newpage/images/logo4.png"
        ]);
    }, 600);
});
回到顶部