tatak
tatak
  • 发布:2024-11-21 18:42
  • 更新:2024-12-13 15:32
  • 阅读:237

【报Bug】安卓打开小程序,有几率页面白屏并报错: Uncaught TypeError: Cannot read property 'setStatusBarStyle' of undefined

分类:uni小程序sdk

产品分类: uni小程序SDK

手机系统: Android

手机系统版本号: Android 14

手机厂商: 小米

手机机型: 小米11、小米14

页面类型: vue

SDK版本号: 4.29、4.24

示例代码:

点击按钮加载初始化 uni-app sdk, 之后打开小程序。以下是基于官方demo的打开小程序的代码片段,改动点为延迟初始化 uni-app sdk:

button1.setOnClickListener(new View.OnClickListener() {  
    @Override  
    public void onClick(View view) {  
        try {  
            // 延迟加载 Uni-App sdk, 这里是点击 button1 的时候,在打开 uni-app 前初始化 sdk  
            initUniAppSDK();  
            if (!DCUniMPSDK.getInstance().isInitialize()) {  
                Toast.makeText(mContext, "uni-app sdk 未初始化", Toast.LENGTH_SHORT).show();  
                return;  
            }  
            UniMPOpenConfiguration uniMPOpenConfiguration = new UniMPOpenConfiguration();  
            // 为了方便观察白屏现象,不设置 SplashView  
            // uniMPOpenConfiguration.splashClass = MySplashView.class;  
            uniMPOpenConfiguration.extraData.put("darkmode", "light");  
            IUniMP uniMP = DCUniMPSDK.getInstance().openUniMP(mContext,"__UNI__F743940", uniMPOpenConfiguration);  
            mUniMPCaches.put(uniMP.getAppid(), uniMP);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
});

延迟加载小程序代码片段,以下是官方 demo 的初始化 uni-sdk 的代码,在此基础上的改动点 setEnableBackground 改为 false:

public void initUniAppSDK() {  
    if (DCUniMPSDK.getInstance().isInitialize()) {  
        Log.i("unimp","uni-app sdk 已初始化过,不再初始化");  
        return;  
    }  

    try {  
        WXSDKEngine.registerModule("TestModule", TestModule.class);  
        WXSDKEngine.registerComponent("myText", TestText.class);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    //初始化 uni小程序SDK ----start----------  
    MenuActionSheetItem item = new MenuActionSheetItem("关于", "gy");  

    MenuActionSheetItem item1 = new MenuActionSheetItem("获取当前页面url", "hqdqym");  
    MenuActionSheetItem item2 = new MenuActionSheetItem("跳转到宿主原生测试页面", "gotoTestPage");  
    List<MenuActionSheetItem> sheetItems = new ArrayList<>();  
    sheetItems.add(item);  
    sheetItems.add(item1);  
    sheetItems.add(item2);  
    Log.i("unimp","onCreate----");  
    DCSDKInitConfig config = new DCSDKInitConfig.Builder()  
            .setCapsule(false)  
            .setMenuDefFontSize("16px")  
            .setMenuDefFontColor("#ff00ff")  
            .setMenuDefFontWeight("normal")  
            .setMenuActionSheetItems(sheetItems)  
            // 改动点: 禁用在后台运行  
            .setEnableBackground(false)  
            .setUniMPFromRecents(false)  
            .build();  
    DCUniMPSDK.getInstance().initialize(this, config, new IDCUniMPPreInitCallback() {  
        @Override  
        public void onInitFinished(boolean b) {  
            Log.d("unimpaa","onInitFinished----"+b);  
        }  
    });  

    //初始化 uni小程序SDK ----end----------  
}

操作步骤:

运行附件中的代码到手机上

步骤1. 进入 App,进入步骤2
步骤2. 点击第一个按钮button1,进入小程序,看是否白屏,如果没有白屏,则进入步骤3,如果有白屏,则复现成功
步骤3. 退出app,进入步骤1

预期结果:

预期结果,在 uni-app sdk 初始化成功(DCUniMPSDK.getInstance().isInitialize() 为 true)之后,打开uni小程序不应该出现白屏,实际是有几率出现白屏

实际结果:

在在 uni-app sdk 初始化成功(DCUniMPSDK.getInstance().isInitialize() 为 true)之后,打开 uni小程序,有几率出现白屏,此时logcat的报错信息为:

com.example.unimpdemo                E  weex_runtime_v2_v8.cpp:528, createInstanceContext and ExecuteJavaScript Error :Uncaught TypeError: Cannot read property 'setStatusBarStyle' of undefined  
                                         at restoreGlobal (uni-jsframework.js:1:193144)  
                                         at  (uni-jsframework.js:1:94074)  
com.example.unimpdemo                E  reportJSException >>>> instanceId:2, exception function:createInstanceContext, exception:Uncaught TypeError: Cannot read property 'setStatusBarStyle' of undefined  
                                         at restoreGlobal (uni-jsframework.js:1:193144)  
                                         at  (uni-jsframework.js:1:94074)  
com.example.unimpdemo                E  onJSException -9700,Uncaught TypeError: Cannot read property 'setStatusBarStyle' of undefined  
                                         at restoreGlobal (uni-jsframework.js:1:193144)  
                                         at  (uni-jsframework.js:1:94074)  
com.example.unimpdemo                E  commitCriticalExceptionRT :WX_RENDER_ERR_JS_CREATE_INSTANCE_CONTEXTexceptionwhite screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property 'setStatusBarStyle' of undefined  
                                                                                                     at restoreGlobal (uni-jsframework.js:1:193144)  
                                                                                                     at  (uni-jsframework.js:1:94074)

bug描述:

延迟初始化 uni-app sdk 的场景。即打开 uni 小程序前 前才初始化 uni-app sdk。此时在打开小程序时,有一定几率页面白屏,logcat日志后续给出

附件1:白屏问题复现的录屏

由于官方demo代码有较多aar,压缩之后体积也较大,无法上传到附件,所以我这边提供 github demo地址: https://github.com/tianma8023/UnimpDemo
此工程代码是在官方提供的demo中的基础下,作出如下改动:

  1. 将uni-app sdk的初始化时机推迟到打开 uni-app 之前
  2. 将小程序 setEnableBackground 置为 false
  3. 为方便观察白屏现象,不设置 SplashView

具体改动具体可以看 commit 的提交记录

官方demo中的uni sdk 是4.24,本人在 4.29 的 sdk 上也能复现。测试手机是 小米11 和 小米14,也均能复现。

我在另一个帖子 https://ask.dcloud.net.cn/question/162328 里面也提及到我这边的应对方案,但这只是临时方案,非长久之计。烦请官方留意此问题。

2024-11-21 18:42 负责人:无 分享
已邀请:
DCloud_Android_DQQ

DCloud_Android_DQQ

收到,在排查

  • tatak (作者)

    好的,麻烦了

    2024-11-22 13:54

1***@163.com

1***@163.com - LTtongxue

遇到同样的问题,有解决方案不,望回复,谢谢

  • tatak (作者)

    临时解决方案就是提早对 uni-sdk 初始化,参考 https://ask.dcloud.net.cn/question/162328

    2024-12-15 15:52

要回复问题请先登录注册