关于近期遇到的坑-SurfaceView,RecylerView等

近期参与了一个多人视频通话的业务,在其中使用SurfaceView负责显示用户的视频流,没想到被坑死。。

关于显示和隐藏

背景: 由于是用六宫格的形式同时展示多人的视频,就选用了RecyclerView来实现,视频用SurfaceView展示,如果用户关掉了摄像头,使用语音模式就不显示SurfaceView,只显示用户头像就可以了。 因为之前仅仅用过SurfaceView当做显示摄像头数据,没有深入研究过,这次栽倒坑里了。

实现的方式是如果是视频模式就add一个surfaceView到一个FrameLayout(如果FrameLayout里面没有的话),如果用户切换到语音模式,就把那个FrameLayout设为GONE,显示头像。

流程看起来一点毛病没有,当收到用户切换模式的回调时,刷新该用户的item。问题来了,用户从视频模式->语音模式切换后,那个SurfaceView还依然显示,诡异的是再次刷新一下就切换了,但是已经差了一步,已经是错误的状态了,还有更诡异的是如果是当前用户点击按钮来切换自己的模式时却会立即改变,一点毛病没有。并且执行notifyDataSetChanged也是正常的。。如果每个用户的添加减少都全量刷新的话,肯定会黑一下,添加退出的动画也废了,这肯定没法接受。

一开始我是认为没有这个View没有失去焦点的原因,之前用的ViewStub,后来干掉,还是不行,用的自定义控件包装的整个多人视频的控件和逻辑,拆开还是不行,问题也不在这儿,因为是加在聊天界面的上面,怀疑是不是聊天的内容或者输入框抢占了焦点,测试了下别的控件,也没有出现这种情况。我想静静了。。

后来偶然发现stackoverflow一个问题(链接),说的是将SurfaceView的父控件setVisibility(GONE),并不能把SurfaceView隐藏,,,SurfaceView单独在一个Window之上,不和父控件在一个View树中。要想隐藏最简单的方式是直接remove掉。虽然这个问题解决了,但是之前点击按钮为啥是可以的,百思不得姐。。。

尽可能选择TextureView来替代SurfaceView吧,TextureView没有这种问题,但项目中因为用的第三方的库,对方只提供了surfaceView的方式,没办法,。。

RecylerView 数据源的坑

多人视频限制最多有6个人参加,如果参与的人少于6个最后面会显示一个邀请或者加入的item,也就是如果有2个人参与,救护显示3个item,5个人参与显示6个item,6个人参与也是6个item。开始的实现方案是,在Adapter的getItemCount里面判断,如果参与人数少于6个要讲参与视频的人数加1,如果已经有6个了,就加0。一有用户加入就调用notifyItemInserted,看似没问题,实际上第6个人加入时,全部崩掉,,好像报了类似越界的问题,在GridLayoutManager.onLayoutChildren crash,原因应该是第六个成员加入的时候,RecylerView认为会变成7个, 实际上getItemCOunt返回的是6个,位移的时候,当然crash掉。找到原因了,就在第6个加入的时候调用notifyItemChanged而不是notifyItemInserted。问题解决。后来又来需求,成员的顺序需要后台配置,每次用户加入的时候,需要去服务端拉一下列表,由于列表的顺序是不可期的,每次拉取后要和本地列表作比对,又不能全刷一次,好在谷歌更提供了DiffUtil,可以将两个列表进行比对,轻松进行位置的移动添加删除的操作,还能保留动画,perfect,果断换上。问题又来了,6个人的时候还是可能会有跟上面一样的crash,没办法,先catch掉再说。写了一个GridLayoutManager的子类,如果崩掉,就catch住,并且全量刷新列表。全量刷新列表带来的问题是全部都要黑一下,并且复现率还挺高。最后还是乖乖的把数据源改了,也就是在列表后面加一个假的mock item,专门用来表示邀请/加入按钮,在所有的add,remove类的写操作时都要check一下成员个数,判断是否要有这个mock item,并且check他的位置是不是在最后。这样后,就没再出问题。

关于局部刷新

在每个item的元素主要有视频,头像,麦克风标识,如果用户关掉麦克风,就要更改麦克风的图标,如果是视频模式的话,调用notifyItemChanged就会整个item刷新,带来的问题是视频黑一下。。所以用了局部更新,也就是使用

void notifyItemChanged(int position, Object payload) ,相应的会执行带payload的onBindViewHolder。但测试发现重写的带payload的onBindViewHolder死活不调用,后来跟踪发现因为使用了github.com/wasabeef/recyclerview-animators这个动画库,这个库并没有重写带payload的onBindViewHolder,好吧,坑,在AnimationAdapter.java重写一下就好了,实际上这个动画库后来也不用了。

关于动画makeSceneTransitionAnimation

makeSceneTransitionAnimation在5.x上有bug,点击A中RecyclerView的item,进入B,A列表刷新,返回A,Crash,报空指针,不知是不是跟有surfaceView 有关,因为在普通的列表刷新是没有问题的,在Android 6+上已经没有问题了,唉,,,坑货。。。

时间: 2024-10-09 23:27:27

关于近期遇到的坑-SurfaceView,RecylerView等的相关文章

react native中的聊天气泡以及timer封装成的发送验证码倒计时

今天看来情书写的文章,研究了一下大佬写的文章,自己做一点总结. 其实,今天我想把我近期遇到的坑都总结一下:1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions     2.父子组件的传值,一可以用callBack  二可以用pubsub发布订阅模式 三可以用manager事件监听(a页面要显示的内容 有两种形式,一是从manager主动接收,也就是说不需要点击什么的获取数据,而是时时监听manager里数据的变化,第二

SCOI2014省选总结

这一次省选,主要是抱着玩的心态去的,如同高二的那些大神高一的心态一样,只记得在省选之前我们一直在说,这一次我们的目标,就是不爆0,最后也如愿以偿的实现了. 首先,请允许我吐槽一下day1.....day1的暴力为什么只有十分!!!!!!!这让我有一种考了跟没考一样的感觉!!!!被希神的贪心虐的体无完肤!!!!!!!unfair!!!!好吧..我有点激动了. 然后再来说一说,day2,day2比起day1好到不知道哪里去了,我还是被虐的体无完肤,Symen Yang day2 说他预估160+,我

React-Native近期采坑小结

1.zIndex 在Android上使用zIndex来控制组件的层级,会遇到元素不显示的问题. 解决方案: 尽量改变组件的顺序,而不用zIndex 尽量不要使用zIndex来控制组件的层级,默认情况下,使用position: 'absolute'后,后面的元素会默认覆盖在前面的元素之上.所以删除zIndex,改变一下组件的顺序就OK啦. issues: https://github.com/facebook/react-native/issues/8968 2.borderStyle:'dash

环境配置(近期实测)——Ubuntu16.04+CUDA9.0+tensorflow-gpu填坑记

近几年深度学习在物体检测方面出现了许多基于不同框架的网络模型,不同模型需要不同的版本的Python.TensorFlow.Keras.CUDA.cuDNN以及操作系统.不得不说,要把经典物体检测网络的源码都跑通,单配置环境就要浪费很多时间,因为目前兼容这些经典网络的框架和环境还很少.新版的TensorFlow在models的objection-detection模块中包含了fast-rcnn.rfcn.SSD几种网络,不过开发环境是基于Ubuntu的,因此我对该环境进行了配置. 1.Ubuntu

能够在子线程绘画的View SurfaceView

转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好Gradle我也是无语了(FQ也没用).准备今天背着笔记本 回家搞.真是服了.. 抱怨的话不说了,来看下这一篇要讲的主角 SurfaceView,关于SurfaceView的文章事实上在别的一些网站上也有,由于我之前没写过,所以也就一直没整这部分的内容(别人写的好坏反正找好的点自己吸收吧,嘿嘿) 问题:Surf

Android混合开发,html5自己主动更新爬过的坑

如今使用混合开发的公司越来越多,尽管出现了一些新技术,比方Facebook的react native.阿里的weex,但依旧阻挡不了一些公司採用h5的决心.当然,这也是从多方面考虑的选择. 在三年前就使用过html5混合开发,当时做的是一款贵金属软件,涨跌五线谱.乾坤交易,还有各个股市的信息,那时候还是上波牛市爆发的前夕,哎... 近期公司让用h5混合开发.一些页面和功能有h5分担,最初时候放在本地assets目录下,后来因为前端同事频繁改动和更新.再加上数据安全方面考虑,决定把包放在serve

微信H5火爆 但入坑需谨慎

微信 已经或者正在重新定义许多事物,H5是其中之一. 似乎就是在一夜之间,各大公司的市场.公关等负责推广和传播的部门人员,纷纷把目光投向了H5.尽管这个由HTML5简称过来的词汇,在大多数人听起来,仍十分陌生且难以理解. 我们可以很清楚的看到,这个市场在逐渐火爆的同时,也越来越混乱,越来越不规范.无论是第三方开发公司,还是广告主,在面对H5营销时都会遇到这样那样的问题,或者说有这样或那样的误区,现在让我们看看这里面的坑究竟在哪? 1.幻想凭一款H5能一夜成名 期望高.投入少,许多市场营销人员,特

医院真的很坑吗???

俗话说十人九痔,十女十痔,很荣幸鄙人也是其中一个受害者: 先讲讲我治疗的全过程吧 进医院之后给所谓的专家说下情况,专家医师开出一个单子,接下就是缴费环节了. 缴费之后,助理医师拿来瓶甘露醇和一个满意看清楚的,让我喝下. 喝完之后不久就开始做灌肠,肠镜,电子肠镜最终确诊是痔疮的一种. 马上准备手术,住院.打吊瓶,每天按时换药. 整个过程单调而富有规律 出院结算的时候,我看到打印的详单,着实捏了把汗.一个痔疮手术居然要15000多元rmb. 手术费5600.治疗费每小时600.清洗雾化每分钟10元,

东拼西凑写的android 相机例子,包含一些遇到的坑

闲扯:最近开始学android开发,还好有些java基础,直接找了个android教程的视频,边学边写.本来我是很懒惰的.不打算写博客,但是在写这个自定义相机的时候,坑还真是不少.容我吐槽下,那些没事儿转载的,搜来搜去都是一样的内容,真是给跪了. 话入正题,本代码是跟着视频里写的,然后又完善的.首先说的一点,就是真的不难,但是很坑:相机写好后,调试了下,有个问题,就是相片很模糊.大小只有200kb,直接说原因,就是没有设置,parameters.setPictureSize(picSize.wi