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:在相似视频播放器性能的时候一个视频播放完也须要开释
发表回复