美文网首页
在Activity和附贴的Fragment中同时使用多Surfa

在Activity和附贴的Fragment中同时使用多Surfa

作者: VE视频引擎 | 来源:发表于2021-08-27 17:35 被阅读0次

    SurfaceView因为独特的双缓冲机制,在android应用中十分普遍,视频播放器、摄像机预览等都会用到,如果在两个Fragment或者一个Fragment和Activity同时使用都会造成无法正常显示。即使设置前面的SurfaceView为不可见也会在少部分机型上依然存在该问题。后来发现原因是SurfaceView是在Windows层显示的,仅仅用View层的方法并不能控制Surface的生命周期。
    解决办法:在需要播放视频的位置外层嵌套一个Layout,这里我用的Framelayout,在释放的时候使用removeAllViews直接释放SurfaceView和他的Surface对象,下面代码:

    /**
     * 释放资源
     */
     private void release() {
        if (mSurfaceView != null && mSurfaceView.getHolder() != null && mSurfaceView.getHolder().getSurface() != null) {
            mSurfaceView.getHolder().getSurface().release();
            if (mSurfaceHolder != null && mEquipmentVideoCallBack != null) {
                mSurfaceHolder.removeCallback(mEquipmentVideoCallBack);
                mSurfaceHolder = null;
            }
        }
        parentLayout.removeAllViews();
     }
    

    需要注意的是,只要界面不在前台或者失去焦点的时候都需要释放一次,还有每次重新播放前也需要释放一次,重新进入准备状态。

    //第1:显示个隐藏的时候
     @Override
     public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        release();
     }
       
    //第2:从新获取焦点到前台
     @Override
     public void onResume() {
        super.onResume();
        release();
    }
       
    //第3:在类似视频播放器功能的时候一个视频播放完也需要释放
    

    相关文章

      网友评论

          本文标题:在Activity和附贴的Fragment中同时使用多Surfa

          本文链接:https://www.haomeiwen.com/subject/xtnmiltx.html