# 小程序加载相关

# 小程序的加载过程

当一个进程启动后加载小程序大概需要完成以下几个步骤。

  1. 加载core:
  • 一个进程想要运行小程序必须优先加载一个内核,并且一个进程只允许加载一个版本的内核,所以同一个进程运行的所有小程序必须依赖同一个版本的内核。

  • SDK内部在加载小程序时会自动去加载内核,所以开发者一般不需要去发起加载内核的操作。

  • 一个进程内核只需要加载一次,后续的其他小程序加载不需要加载内核。

  1. 加载对应小程序:
  • 加载对应的小程序js链接。

如果想监听整个过程可以注册以下接口:

  1. 监听内核加载进度registerCoreLoadingStateListener

  2. 监听小程序的加载进度setMiniAppObserver

// 监听内核的加载进度
JSViewCoreManager.getInstance().registerCoreLoadingStateListener(new JSViewCoreManager.CoreLoadingStateListener() {
    @Override
    public void onCoreStartLoad(String coreVersion) {

    }

    @Override
    public void onCoreReady(String coreVersion,int coreStatus,int suggest) {

    }

    @Override
    public void onProgress(String coreVersion,int maxSteps, int currentStep, int downloadTotal, int downloaded, String info) {

    }

    @Override
    public void onCoreFail(String coreVersion,String info) {

    }

});

//监听小程序的加载进度
mMainPageProxy.setMiniAppObserver(new MiniAppObserver() {
    @Override
    public void onMiniAppStartLoad(MiniApp miniApp) {
        
    }

    @Override
    public void onMiniAppLoadProgress(MiniApp miniApp, int progress) {

    }

    @Override
    public void onMiniAppLoadSuccess(MiniApp miniApp) {

    }

    @Override
    public void onMiniAppLoadFail(MiniApp miniApp, int errorCode) {

    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# 如何设置小程序内核的下载地址

  • 方法一:
/*
设置小程序内核的下载服务器, 存在主备切换场景建议用这个处理
如果后续加载的小程序启动参数里也设置了内核下载服务器(方法二),则会覆盖这次的设置。
*/
JSViewApp.getInstance().setConfig(JSViewApp.CONFIG_CORE_UPDATE_URL,"http://......");
1
2
3
4
5
  • 方法二:

在加载的小程序地址中添加

// 链接中添加coreUpdateUrl参数,注意要在小程序加载之前就设置
intent.putExtra("URL","http://xxxxx/xxx.mjs?coreUpdateUrl=http%3A%2F%2Fxxx");
1
2

# 小程序加载失败的监听与处理

// 监听小程序加载状态
mMainPageProxy.getJSViewParent().registerMiniAppObserver(mMiniAppObserver);
1
2
private final MiniAppObserver mMiniAppObserver = new MiniAppObserver() {
    @Override
    public void onMiniAppStartLoad(MiniApp miniApp) {
        // 小程序开始加载

    }

    @Override
    public void onMiniAppLoadProgress(MiniApp miniApp, int i) {
        // 小程序加载进度
    }

    @Override
    public void onMiniAppLoadSuccess(MiniApp miniApp) {
        // 小程序加载成功
    }

    @Override
    public void onMiniAppLoadFail(MiniApp miniApp, int errorCode) {
        // 小程序加载失败

        // 用 errorCode 也能判断出是内核加载失败
        if(errorCode == MiniAppObserver.ERROR_CODE_CORE_LOAD_FAIL){
            // 内核加载失败
            // 如果有备用地址,可以可以尝试设置内核下载的服务器,然后重新加载小程序
            JSViewApp.getInstance().setConfig(JSViewApp.CONFIG_CORE_UPDATE_URL,"http://......");
            mMainPageProxy.loadUrl("http://xxxx/xxx.mjs?xx=xx"); // 地址不变, 但可以触发小程序重新加载(包含内核加载过程)
        }else{
            // 内核加载完毕,但是js加载失败

            // 如果有备用地址,也可以选择加载备用地址
            mMainPageProxy.loadUrl("http://xxxx/备用地址.mjs?xx=xx"); // 触发小程序重新加载(内核已经加载完毕下,只会重新触发js加载)
        }
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 如何关闭小程序加载的过渡界面与加载失败提示

sdk内部会默认实现启动的过渡界面与小程序加载失败的提示,可以调用以下接口去关闭

// 关闭小程序加载的过渡界面与加载失败提示
mMainPageProxy.setEnableStartUpRender(false);
1
2

# 提前下载新版本内核

可以通过提前下载新版本内核的手段,规避内核下载太占时间,影响使用新内核的新版本页面的启动体验的问题。 具体接口如下: 在js代码中调用

import { jJsvRuntimeBridge } from "jsview";

/**
 * 触发预下载内核
 * @param {String} core_version 带branch(主分支版本不带此信息)和版本信息的内核版本, 
 *                              例如: 1021265_release_build_xxx
 */
jJsvRuntimeBridge.preDownloadCore("1021265_release_build_xxx");
1
2
3
4
5
6
7
8

PS: 此处理不会触发 java 中的 CoreLoadingStateListener 回调。

Last Updated: 6/27/2023, 3:11:31 AM