预加载
适用于 Whiteboard Android SDK 2.16.134,使用已公开的 WhiteboardView、WhiteSdk 和 joinRoom 接口。
预加载将白板内嵌页面加载、Bridge 握手和 SDK 初始化提前到候课阶段。用户进入课堂时,复用同一组 View 与 SDK,再提交房间参数。候课阶段不调用 joinRoom,不创建房间会话。
接入流程
- 在主线程创建并持有
WhiteboardView,放入有实际尺寸的候课容器。 - 确定 SDK 配置并创建
WhiteSdk,由 SDK 启动初始化。多窗口、教具插件和动态配置地址应在此时配置。 - 用户进入课堂时显示原 View,在同一 SDK 上调用
joinRoom。 - 退出时等待
leaveRoom成功,再决定保留实例或销毁 View。
本例在同一个 Activity 内切换候课和课堂容器。只创建空 WebView、进入课堂时重新创建 View 或重新加载页面,都不能保留这组实例的准备结果。
候课阶段:提前创建
以下字段和方法位于业务 Activity 中;容器由业务布局提供。示例使用 com.herewhite.sdk 下的 SDK 类型、com.herewhite.sdk.domain 下的 Promise、RoomParams、Region、WindowParams 和 SDKError。
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,由入房结果判断是否成功。
进入课堂:复用并入房
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。
退出与资源回收
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 的调度不能作为完成保证。