希望本文可以带给大家一个相对全局的视角看待卡顿问题,认识到卡顿是什么、卡顿的成因、卡顿的分类、卡顿的优化和一些经验积累,有的放矢地解决App流畅性问题。接下来会从以下五个方面进行讲述:什么是卡顿为什么会发生卡顿如何评价卡顿如何优化卡顿1.什么是卡顿卡顿,顾名思义就是用户体感界面不流畅。我们知道手机的屏幕画面是按照一定频率来刷新的,理论上讲,24帧的画面更新就能让人眼感觉是连贯的。但是实际上,这个只是针对普通的视频而言。对于一些强交互或者较为敏感的场景来说,比如游戏,起码需要60帧,30帧的游戏会让人感觉不适;位移或者大幅度动画30帧会有明显顿挫感;跟手动画如果能到90帧甚至120帧,会让人感觉
背景客服一站式工作台包含了在线、电话、工单和工具类四大功能模块。其中很多通用的模块,比如工单详情、订单详情都是通过iframe的形式嵌套的,在系统加载过程中会比较耗时,再加上在线消息通信模块强依赖tinode第三方SDK,很多方法都是直接调用tinode提供的API,同时也继承了tinode很多不合理的方式,从使用tinode到目前为止,因迭代资源的投入,一直没有对tinode源码做一些优化和改进,当消息通信的模式改成广播之后,会话卡顿问题就暴露出来了。通过对tinode源码消息链路模块的阅读,发现了有不少的优化空间,本文则是针对消息链路这块阐述的具体优化实现。发现问题2.1消息数据处理流程存
背景客服一站式工作台包含了在线、电话、工单和工具类四大功能模块。其中很多通用的模块,比如工单详情、订单详情都是通过iframe的形式嵌套的,在系统加载过程中会比较耗时,再加上在线消息通信模块强依赖tinode第三方SDK,很多方法都是直接调用tinode提供的API,同时也继承了tinode很多不合理的方式,从使用tinode到目前为止,因迭代资源的投入,一直没有对tinode源码做一些优化和改进,当消息通信的模式改成广播之后,会话卡顿问题就暴露出来了。通过对tinode源码消息链路模块的阅读,发现了有不少的优化空间,本文则是针对消息链路这块阐述的具体优化实现。发现问题2.1消息数据处理流程存
ScrollView和RecyclerView都是滑动组件,因此存在滑动事件冲突问题,解决思路就是在事件分发函数中将其中下层View的滑动事件做拦截处理布局示例代码如下:注意:在布局中包裹一层RelativeLayout,并且加上这个属性android:descendantFocusability="blocksDescendants"blocksDescendants这个属性的官方解释是viewgroup会覆盖子类控件而直接获得焦点继承ScrollView类自定义ScrollViewimportandroid.annotation.TargetApi;importandroid.conten
ScrollView和RecyclerView都是滑动组件,因此存在滑动事件冲突问题,解决思路就是在事件分发函数中将其中下层View的滑动事件做拦截处理布局示例代码如下:注意:在布局中包裹一层RelativeLayout,并且加上这个属性android:descendantFocusability="blocksDescendants"blocksDescendants这个属性的官方解释是viewgroup会覆盖子类控件而直接获得焦点继承ScrollView类自定义ScrollViewimportandroid.annotation.TargetApi;importandroid.conten
记录一次RecyclerView卡顿案例和解决方案。需求:界面由两部分组成,顶部一个图片,图片下面是列表。在列表滑动时,图片跟着滑动。实现:NestedScrollView[LinearLayout[ImageView,RecyclerView]]。结果:当数据量较大时,RecyclerView会越划越卡。原因:NestedScrollView嵌套RecyclerView,NestedScrollView的MeasureSpec.UNSPECIFIED测量子View,导致RecyclerView高度不确定,有多少item就会创建多少个ViewHolder,导致RecyclerView的复用机制
记录一次RecyclerView卡顿案例和解决方案。需求:界面由两部分组成,顶部一个图片,图片下面是列表。在列表滑动时,图片跟着滑动。实现:NestedScrollView[LinearLayout[ImageView,RecyclerView]]。结果:当数据量较大时,RecyclerView会越划越卡。原因:NestedScrollView嵌套RecyclerView,NestedScrollView的MeasureSpec.UNSPECIFIED测量子View,导致RecyclerView高度不确定,有多少item就会创建多少个ViewHolder,导致RecyclerView的复用机制
和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、美颜相机录制视频trace分析概览二、CameraFWK与cameraHAL录像交互三、美颜相机app与SurfaceFlinger交互四、美颜相机卡顿丢帧trace分析一、美颜相机录制视频trace分析概览美颜相机录制视频trace分析概览截取1s内美颜相机帧率为30fps,对应的CameraHAL、CameraFWK、美颜相机App的帧率如上二、CameraFWK与cameraHAL录像交互CameraFWK与cameraHAL录像交互CameraFWK与cameraHAL录像交互CameraF
和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、美颜相机录制视频trace分析概览二、CameraFWK与cameraHAL录像交互三、美颜相机app与SurfaceFlinger交互四、美颜相机卡顿丢帧trace分析一、美颜相机录制视频trace分析概览美颜相机录制视频trace分析概览截取1s内美颜相机帧率为30fps,对应的CameraHAL、CameraFWK、美颜相机App的帧率如上二、CameraFWK与cameraHAL录像交互CameraFWK与cameraHAL录像交互CameraFWK与cameraHAL录像交互CameraF
一、卡顿问题的几种原因复杂UI、图文混排的绘制量过大;在主线程上做网络同步请求;在主线程做大量的IO操作;运算量过大,CPU持续高占用;死锁和主子线程抢锁。二、监测卡顿的思路监测FPS:FPS是一秒显示的帧数,也就是一秒内画面变化数量。如果按照动画片来说,动画片的FPS就是24,是达不到60满帧的。也就是说,对于动画片来说,24帧时虽然没有60帧时流畅,但也已经是连贯的了,所以并不能说24帧时就算是卡住了。由此可见,简单地通过监视FPS是很难确定是否会出现卡顿问题了,所以我就果断弃了通过监视FPS来监控卡顿的方案。RunLoop:通过监控RunLoop的状态来判断是否会出现卡顿。RunLoop