SurfaceView和MediaCodec搭配使用退到后台黑屏的问题(应用切换等情况)_surfacetexture 播放视频退到后台-程序员宅基地

技术标签: Android开发问题解决  SurfaceView  

前几天遇到了一个有关SurfaceView和MediaCodec搭配使用,退到后台黑屏的问题(应用切换等情况)。这里我分享一下个人最后的解决方案,大家如果用到可以参考。

这个问题要么释放或者不释放。我采取的策略是不释放,更换显示的控件。

1、这里的显示控件 SurfaceView更换成TextureView 。 原因就是TextureView 可以控制后面的显示view不销毁。下

面就是代码:

mTextureview = (TextureView) findViewById(R.id.textureview);

mTextureview.setSurfaceTextureListener(this);

实现TextureView.SurfaceTextureListener这个接口。

关键点下面这两个方法:

@Override

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { presenterControl.SurfaceViewDestroy();

/退到后台让解码线程暂停mediacodec不释放

mSurfaceTexture = surface; return false;// }

我们在销毁的时候返回false,并保存SurfaceTexture对象,然后从后台返回界面的时候在onSurfaceTextureAvailable()方法中,调用setSurfaceTexture(mSurfaceTexture)方法,这样就会恢复之前的画面了。

@Override

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

if(mSurfaceTexture != null){ mTextureview.setSurfaceTexture(mSurfaceTexture);// 一定要设置回来

}

presenterControl.SurfaceOnCreate();//MediaCodec的创建以及开始解码(如存在不为空就不创建)

}

生命周期控制: 切换至后台的时候会调用onSurfaceTextureDestroyed,从后台切换回来会调用onSurfaceTextureAvailable。 TextureView的ViewGroup remove TextureView的时候会调用onSurfaceTextureDestroyed方法。相同,TextureView的ViewGroup add TextureView的时候会调用onSurfaceTextureAvailable。这些都是建立在视图可见的基础上,如果视图不可见,add也不会调用onSurfaceTextureAvailable方法,remove也不会调用onSurfaceTextureDestroyed方法。 当TextureView设置为Gone的时候,并不会调用onSurfaceTextureDestroyed方法法。

2、我们要用到的MediaCodec 在configure时候使用的Surface. 则定义一个方法得到:

public Surface getSurface() {

if (mSurface == null){

mSurface = new Surface(mTextureview.getSurfaceTexture()); }

return mSurface; }

3、由于这里我们没有自动的去释放这个SurfaceTexture,所以在页面销毁的时候。一定要onDetachedFromWindow()手动释放。不然SurfaceTexture会报异常退出错误。

@Override
public void onDetachedFromWindow(){ //如果需要一个比较长生命周期的SurfaceTexture,但是一定要在onDetachedFromWindow()方法中做释放操作.
    super.onDetachedFromWindow();
    if (mSurfaceTexture != null)  {
        mSurfaceTexture.release();
        mSurfaceTexture = null;
    }
    if (surface0 != null) {
        surface0.release();
        surface0 = null;
    }
}

4、补充说明,在实践中遇到了项目卡顿的问题。具体的原因是因为surface本质上是一个缓存显示区域,如果没有释放就会导致卡顿。所以在退到后台的过程中需要释放。在生命周期中加入下面的代码。surface.release();

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28334473/article/details/83505052

智能推荐

NanoPC-T2 Uboot启动过程分析 - 2-6 board_init_r() part 2_uboot board late int-程序员宅基地

文章浏览阅读1.3k次。在继续分析之前,先回顾当前 gd 的内容:bd_t *bd = 0x42BF_FF10{unsigned long bi_memstart = 0phys_size_t bi_memsize = 0unsigned long bi_flashstart = 0unsigned long bi_flashsize = 0unsigned long bi_flashoffset = 0unsigned_uboot board late int

四象限法推导lm曲线_IS曲线推导-程序员宅基地

文章浏览阅读8.9k次。展开全部推导is曲线有三种方法,分别是四象限32313133353236313431303231363533e4b893e5b19e31333431343663法,投资储蓄法,ad=as法,其中四象限法用到了投资储蓄函数。这里介绍一下四象限法和ad=as法。四象限法,就是由三个函数来推导另一个函数,is产品市场的函数。这三个函数分别是投资储蓄函数,储蓄函数,和投资利率函数。有图形可以很直观的表示出..._is曲线形成的四象限法

seata_server启动报错:the name of service provider for [io.seata.core.store.db.DataSourceGenerator]-程序员宅基地

文章浏览阅读8.4k次。nacos:1.3.0seata:1.2.0坑:使用docker部署的nacos服务,在seata下载seata1.2.0的压缩包部署到服务器上,在部署seata_server时,使用nacos存seata_server的配置,上传seata的配置的到nacos中,上传步骤略,上传成功后可以在nacos中看到seata的配置:上传配置后,修改seata_server相关配置后,启动seata_server一直报错:the name of service provider for [._the name of service provider for [io.seata.core.store.db.datasourceprovider]

UML 对象图、时序图、活动图 、状态图、协作图 、包图、组件图及部署图_公司和部门的对象图-程序员宅基地

文章浏览阅读6.8k次,点赞3次,收藏55次。UML 对象图、时序图、活动图 、状态图、协作图 、包图、组件图及部署图目录对象图时序图活动图状态图协作图包图组件图部署图对象图对象图是类图的一个实例,用于显示系统执行时的一个可能的快照,即在某一个时间上系统可能出现的样子,对象图用带下划线的对象名称来表示对象.表现对象的特征 对象图展现了多个对象的特征及对象之间的交互时序图对象:时序图中对象使用矩形表示,并且对象名称下有下划线 将对象置于时序图的顶部说明在交互开始时对象就已经存在了。 如_公司和部门的对象图

阿里云服务器 nginx公网IP无法访问浏览器_ecs nginx 无法访问-程序员宅基地

文章浏览阅读1.4w次,点赞23次,收藏26次。转载自:https://blog.csdn.net/LJFPHP/article/details/78670459一、开始找原因在浏览器输入:http://ip,正常的话,会有页面,welcome to nginx 我这里是浏览器访问失败, 查找原因:1、在服务器上访问Ip执行:curl http://ip 结果:超时,未连接成功查看nginxaccess.log日志,发现日志未滚动,代表本机访问..._ecs nginx 无法访问

《Reids 设计与实现》第十六章 集群(下)_为什么不直接向节点广播publish命令-程序员宅基地

文章浏览阅读1.5k次。《Reids 设计与实现》第十六章 集群(下)_为什么不直接向节点广播publish命令

随便推点

c语言程序中小括号"()"和大括号"{}"的本质是什么,C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。...-程序员宅基地

文章浏览阅读3.5k次。C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。序中“经”是一种在理论体系建构上从现象界到本体界反推的逻辑。()用对语句条语句《中华人民共和国网络安全法》是我国第一部全面规范网络空间安全管理方面问题的基础性法律。国家倡导诚实守信、大括的多健康文明的网络行为,大括的多推动传播社会主义核心价值观,采取措施提高全社会的( )和水平,形成全社会共同参与促进网络安全..._c语言中的大括号和小括号

Could not resolve placeholder 'spring.security.mapping.directory' in string value "${spring.security_could not resolve placeholder 'tenant.mapping' in -程序员宅基地

文章浏览阅读3.7k次。1、错误描述2015-09-20 22:30:25 [main] WARN org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attemptorg.springframew_could not resolve placeholder 'tenant.mapping' in value

angular之路——angular从0到1(持续更新)_angular项目从零到一-程序员宅基地

文章浏览阅读295次。angular从0到1:环境安装及运行angular从0到1:angular结构目录详解_angular项目从零到一

Python使用pandas包实现:读取文本文件data.txt(文件中每行存取一个整数),将其按照升序排序后再写入文本文件data_asc.txt文件中_数据文件data.txt里存储了若干个整型数,完成如下任务 ①读取文件里的数值用数组存-程序员宅基地

文章浏览阅读3.5k次。一、问题描述 已知一个文本文件(data.txt),其中存有若干数据,存储数据均为整数(不同整数之间以换行符进行的分隔),现要求使用python读取原始数据文件(文件中每行存取一个整数),将其按照升序排序之后再写入文本文件data_asc.txt文件中进行保存并且进行存储。二、代码实现import numpy as np#导入功能模块包import pandas as pdwith open ("C:/Users/lenovo/Desktop/data.txt",'r')..._数据文件data.txt里存储了若干个整型数,完成如下任务 ①读取文件里的数值用数组存

VS配置PCL全网最简单的方法(vcpkg一步到位)_vs 配置vcpkg pcl-程序员宅基地

文章浏览阅读7.2k次,点赞13次,收藏58次。一、安装vcpkg 进入安装地址(https://github.com/Microsoft/vcpkg)下载压缩包,如下图所示,然后解压到任意一个文件夹,我直接放入了D盘根目录(D:\vcpkg-master) 然后打开cmd,进入vcpkg 根目录中,我这里就是D:\vcpkg-master,运行 vcpkg 引导程序:bootstrap-vcpkg.bat 然后等待vcpkg安装完..._vs 配置vcpkg pcl

K-means与K-medoids_kmeans和kmedoids的区别-程序员宅基地

文章浏览阅读1.1k次。K-means(K-均值)由簇中样本的均值代表整个簇,而K-medoids(K-中心点)由处在簇中心区域的某个样本代表整个簇。K-means聚类:基本思想:初始随机给定k个簇中心,按着最近邻原则把待分类样本点分到各个簇中,单后按照平均法重新计算各个簇的质心,从而确定新的簇心,一直迭代,直到簇心的移动小于给定的值,或者达到最大迭代次数。优缺点:优点:1,可扩展性好,算法复杂..._kmeans和kmedoids的区别

推荐文章

热门文章

相关标签