集成Vidyo库后退出视频聊天应用无崩溃重启问题求助
看起来你碰到的是Vidyo库资源释放不彻底引发的EGL显示异常,这种情况在多Activity切换时特别常见——毕竟视频渲染库往往会持有GPU/EGL上下文资源,如果清理不及时,就会导致后续Activity的显示环境出问题。结合你提到的EGL_BAD_DISPLAY错误,我给你几个具体的排查和解决方向:
彻底释放Vidyo相关资源
一定要在Vidyo Activity的onDestroy()(甚至可以提前到onStop())里显式销毁所有Vidyo实例和关联视图,别依赖库的自动清理。比如:@Override protected void onDestroy() { super.onDestroy(); // 销毁Vidyo客户端实例 if (mVidyoClient != null) { mVidyoClient.Destroy(); mVidyoClient = null; } // 清空视频渲染视图的引用,避免持有旧的显示上下文 if (mVideoRenderView != null) { mVideoRenderView = null; } }这里要注意:必须确保
Destroy()方法在正确的线程调用(一般是主线程,或者Vidyo文档指定的线程),否则资源可能释放不彻底。检查EGL上下文的生命周期
EGL_BAD_DISPLAY的本质是当前的EGL显示连接已经失效,大概率是Vidyo在后台还持有旧的EGL上下文。你可以尝试在Vidyo Activity的onPause()里暂停视频渲染,onStop()里主动释放EGL相关资源,切断和旧Display的关联。排查Activity栈与启动模式
如果你启动Vidyo Activity用了singleInstance这类特殊启动模式,可能会导致Activity栈的上下文混乱,触发系统的异常处理逻辑。建议改用标准的启动方式(比如startActivityForResult或AndroidX的registerForActivityResult),确保返回原Activity时,栈状态是正常的。补充日志定位问题
虽然目前只有EGL错误,但可以在Vidyo资源释放的关键节点加日志,确认Destroy()是否真的执行了,以及执行时的线程信息。另外,在原Activity的onResume()里打印当前的Display、Window信息,看看是否存在Display实例失效的情况。
这种无崩溃重启其实是Android系统在检测到GPU资源异常时的自动保护机制,核心就是要确保Vidyo的所有资源在Activity销毁时被彻底清理,不能残留对旧Display/EGL上下文的引用。
内容的提问来源于stack exchange,提问作者Robert Goodrick

