问题/风险描述:
用户新进入A房间推流,过一段时间之后,用户退出A房间,然后进入B房,出现了预览画面黑屏现象,从仪表盘看没有视频推流数据。本地日志显示用户确实先从A房间退出(exitRoom A),然后再进入B房间(enterRoom B),同时日志有报glError 1282错误。
安卓端报glError 1282错误通常是glContext环境切换异常导致,进一步排查日志发现,用户在退房后,没有等待onExitRoom事件回调,而是在exitRoom之后就调用enterRoom进入了另一个房间。
代码语言:javascript复制//参考代码
mTRTCParams = new TRTCCloudDef.TRTCParams();
mTRTCParams.sdkAppId = GenerateTestUserSig.SDKAPPID;
mTRTCParams.userId = mUserId;
mTRTCParams.roomId = Integer.parseInt(mRoomId);
mTRTCParams.userSig = GenerateTestUserSig.genTestUserSig(mTRTCParams.userId);
mTRTCParams.role =TRTCCloudDef.TRTCRoleAudience;
// 退出房间
mTRTCCloud.exitRoom();
// 进入房间
mTRTCCloud.enterRoom(mTRTCParams, TRTC_APP_SCENE_LIVE);
根据TRTC SDK的规范,退出房间会释放相关的资源,状态会重置,但这个过程是异步的。在触发 onExitRoom回调之前,相关的操作会在SDK线程执行,执行完毕后才会触发onExitRoom。
因为用户在退房过程中,没有等待相关的状态重置完毕,就再次进入另外一个房间,导致SDK内部状态混乱,报错glContext 切换异常。
解决方案:
通过上面分析知道,该问题的原因是因为进房(enterRoom)的时机不对,解决办法是在执行再次进入新的房间操作时候,需要等待前一个退房操作完成;
改进步骤只需要把进入房间的相关代码,移动到onExitRoom的事件回调里面执行。
代码语言:javascript复制//参考代码
boolean dontEnterRoom = false;
@Override
public void onExitRoom(int code) {
// 退出前一个房间的事件
if(code>=0 && !dontEnterRoom) {
mTRTCParams = new TRTCCloudDef.TRTCParams();
mTRTCParams.sdkAppId = GenerateTestUserSig.SDKAPPID;
mTRTCParams.userId = mUserId;
mTRTCParams.roomId = Integer.parseInt("2222");
mTRTCParams.userSig = GenerateTestUserSig.genTestUserSig(mTRTCParams.userId);
mTRTCParams.role = TRTCCloudDef.TRTCRoleAnchor;
mTRTCCloud.enterRoom(mTRTCParams, TRTC_APP_SCENE_LIVE);
dontEnterRoom = true;
}
}
注意事项:
在进入房间(enterRoom)和退出房间(exitRoom)SDK都会在SDK线程执行一些耗时操作,从而避免UI因此卡住,所以需要等待各自操作完成的事件回调,才可以继续执行相关操作。另外,如果只是进入另外的房间,推荐使用switchRoom接口。