TextureView 使用报错异常detachFromGLCo

2018-04-26  本文已影响0人  GexYY

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系统4.4之前的版本(eg:4.0或4.1)系统,可能会异常报错,主要原因是因为TextureView必须持有一个活跃未被释放的SurfaceTexture,在onSurfaceTextureDestroyed(SurfaceTexture surface)方法回掉用,要准备的返回true和false,而不能一直返回true;

原因我们看一下TextureView内部源码会发现,如果返回true的时机不合适,SurfaceTexture就会被销毁和释放,就会有概率出现异常

源码.png

解决办法1:
参考Bilibili的ijkplayer内部实现
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;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读