乐趣区

关于android:在Activity和附贴的Fragment中同时使用多Surface错乱解决

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:在相似视频播放器性能的时候一个视频播放完也须要开释 
退出移动版