预加载

  • Android

更新时间不可用

适用于 Whiteboard Android SDK 2.16.134,使用已公开的 WhiteboardView、WhiteSdk 和 joinRoom 接口。

预加载将白板内嵌页面加载、Bridge 握手和 SDK 初始化提前到候课阶段。用户进入课堂时,复用同一组 View 与 SDK,再提交房间参数。候课阶段不调用 joinRoom,不创建房间会话。

接入流程

  1. 在主线程创建并持有 WhiteboardView,放入有实际尺寸的候课容器。
  2. 确定 SDK 配置并创建 WhiteSdk,由 SDK 启动初始化。多窗口、教具插件和动态配置地址应在此时配置。
  3. 用户进入课堂时显示原 View,在同一 SDK 上调用 joinRoom。
  4. 退出时等待 leaveRoom 成功,再决定保留实例或销毁 View。

本例在同一个 Activity 内切换候课和课堂容器。只创建空 WebView、进入课堂时重新创建 View 或重新加载页面,都不能保留这组实例的准备结果。

候课阶段:提前创建

以下字段和方法位于业务 Activity 中;容器由业务布局提供。示例使用 com.herewhite.sdk 下的 SDK 类型、com.herewhite.sdk.domain 下的 Promise、RoomParams、Region、WindowParams 和 SDKError。

Java
private WhiteboardView whiteboardView;
private WhiteSdk whiteSdk;
private Room room;
private boolean joining;

private void preload(FrameLayout waitingContainer, String appIdentifier) {
    if (whiteSdk != null) return;

    whiteboardView = new WhiteboardView(this);
    waitingContainer.addView(whiteboardView, new FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));

    WhiteSdkConfiguration config = new WhiteSdkConfiguration(appIdentifier, true);
    config.setRegion(Region.cn);
    config.setUseMultiViews(true);
    config.setEnableAppliancePlugin(true);
    whiteSdk = new WhiteSdk(whiteboardView, this, config);
    // 此处不入房;可以用候课内容覆盖白板区域。
}

构造方法返回只表示 Native 对象已创建。当前版本没有可等待的 SDK 预加载完成接口,不要据此显示“白板已就绪”,也不要用固定延时判断完成。用户提前进入课堂时,仍按正常流程调用 joinRoom,由入房结果判断是否成功。

进入课堂:复用并入房

Java
private void enterClass(FrameLayout classroomContainer,
                        String roomUuid, String roomToken, String userId) {
    if (whiteSdk == null || joining || room != null) return;
    joining = true;

    ViewGroup parent = (ViewGroup) whiteboardView.getParent();
    if (parent != null) parent.removeView(whiteboardView);
    classroomContainer.addView(whiteboardView, new FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));

    RoomParams params = new RoomParams(roomUuid, roomToken, userId);
    params.setRegion(Region.cn);
    params.setWritable(true);
    params.setWindowParams(new WindowParams());
    whiteSdk.joinRoom(params, new Promise<Room>() {
        @Override
        public void then(Room joinedRoom) {
            joining = false;
            room = joinedRoom;
            whiteboardView.post(() -> {
                if (room == joinedRoom) joinedRoom.refreshViewSize();
            });
        }

        @Override
        public void catchEx(SDKError error) {
            joining = false;
            Log.e("Whiteboard", "加入房间失败", error);
        }
    });
}

示例省略房间事件监听;需要监听时使用带 RoomListener 的重载,参见加入白板房间。容器尺寸变化后调用 refreshViewSize,应等新布局生效。示例没有重新构造 SDK,也没有调用 loadUrl 或 reload。

退出与资源回收

Java
private void leaveClass() {
    if (whiteSdk == null || joining || room == null) return;
    whiteSdk.leaveRoom(new Promise<Object>() {
        @Override
        public void then(Object ignored) {
            room = null;
            // 退出已确认。可保留同一组实例,之后串行加入下一个房间。
            // 若最终不用,再从父容器移除 View,调用 destroy() 并清理引用。
        }

        @Override
        public void catchEx(SDKError error) {
            Log.e("Whiteboard", "退出未确认,暂停复用或销毁流程", error);
        }
    });
}

退出等待期间应禁用重复进入和退出操作。页面主动退出时先等待上述回调,再结束 Activity;系统强制销毁无法保证异步退房完成。不要将使用 Activity Context 的 View 放入全局静态池,或在旧 Activity 销毁后交给新 Activity 继续使用。

能力边界

预加载不包含房间鉴权、房间状态同步、WindowManager 挂载、课件下载或可见首帧。启用动态配置后,远端配置仍在每次入房前读取;SDK 提前创建不代表配置已下载。课件资源策略见课件按需加载。

prepareWhiteConnection 是独立的网络接入准备辅助接口,不保留本页所需的 View 与 SDK,不能替代上述流程。收益应分别记录候课初始化、点击进入到入房成功、点击进入到可见首帧,按目标设备实测;完全隐藏、零尺寸和后台 WebView 的调度不能作为完成保证。