Log日志異常信息
java.lang.RuntimeException
Error during detachFromGLContext (see logcat for details)
android.graphics.SurfaceTexture.detachFromGLContext(SurfaceTexture.java:179)
android.view.TextureView.destroySurface(TextureView.java:226)
android.view.TextureView.access$000(TextureView.java:105)
android.view.TextureView$1.run(TextureView.java:214)
android.view.HardwareRenderer$Gl20Renderer.safelyRun(HardwareRenderer.java:1528)
android.view.TextureView.onDetachedFromWindow(TextureView.java:211)
android.view.View.dispatchDetachedFromWindow(View.java:11810)
android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:3)
android.view.ViewGroup.removeAllViews(ViewGroup.java:3765)
Android系統(tǒng)4.4之前的版本(eg:4.0或4.1)系統(tǒng)倚搬,可能會異常報錯叫惊,主要原因是因為TextureView必須持有一個活躍未被釋放的SurfaceTexture藐俺,在onSurfaceTextureDestroyed(SurfaceTexture surface)方法回掉用,要準(zhǔn)備的返回true和false禽额,而不能一直返回true;
原因我們看一下TextureView內(nèi)部源碼會發(fā)現(xiàn)克伊,如果返回true的時機不合適禁荒,SurfaceTexture就會被銷毀和釋放猬膨,就會有概率出現(xiàn)異常
源碼.png
解決辦法1:
參考Bilibili的ijkplayer內(nèi)部實現(xiàn)
https://github.com/Bilibili/ijkplayer/blob/master/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/TextureRenderView.java
解決辦法2:
在onSurfaceTextureDestroyed()方法中一直返回false,如果需要一個比較長生命周期的SurfaceTexture呛伴,但是一定要在onDetachedFromWindow()方法中做釋放操作.
@Override
protected void onDetachedFromWindow(){
super.onDetachedFromWindow();
if (mSurfaceTexture != null) {
mSurfaceTexture.release();
mSurfaceTexture = null;
}
if (mSurface != null) {
mSurface.release();
mSurface = null;
}
}