主要观点总结
本文介绍了在业务需求与产品形态高度不确定性的情况下,如何应对产品形态与产品节奏相对确定的情况,并探索了淘宝交易终端架构的演进方向。文章主要描述了如何通过混合架构(Native 业务容器 + Weex 2.0)来解决体验问题,并针对购物车技术架构的探索和优化进行了详细的阐述。
关键观点总结
关键观点1: 购物车的技术架构和挑战
介绍了购物车的技术架构,包括DX+Native的方式以及面临的挑战,如性能问题和迭代效率。
关键观点2: SurfaceView闪黑问题的原因和解决方案
详细解释了SurfaceView闪黑问题的原因,包括SurfaceView的特性以及页面切换时的问题。同时介绍了多种解决方案,如修改Fragment切换方式、截屏、Image->Surface转换等。
关键观点3: 不同解决方案的优缺点
分析了不同解决方案的优缺点,包括性能、内存、CPU等方面的考虑。
关键观点4: 团队介绍和拓展阅读
介绍了淘天集团基础交易终端团队的工作内容和职责,以及相关的拓展阅读,如3DXR技术、终端技术、音视频技术、服务端技术等。
正文
-
SurfaceView被removeView,如:主Tab切换
-
Activity前后台切换,如:打开详情/回到手机Home
-
DX+Native购物车Tab切换为什么没有闪的问题呢?
DX采用原生View绘制,Fragment页面切换受VSync信号和MessageQueue的同步屏障控制,确保在执行完performTraversals()(即View的测量、布局和绘制三大流程)之后,才进行下一步操作,这样可以保证UI的一致性。
由于SurfaceView的特性,可见性变化的时候,就可能导致黑屏。业内有几种解决办法:
-
页面切换不执行remove SurfaceView,只执行visible/gone
-
-
▐
Fragment不销毁
概述
主Tab页面切换,由FragmentManager的attach/detach改为show/hide,避免SurfaceView可见性变化
效果
Tab切换不会闪。
方案细节
修改Fragment切换方式:从attach/detach改为show/hide
show/hide不会触发购物车Fragment的生命周期回调,
SurfaceView也不会从view树中移除,因此切换不会闪。
回到主Tab的场景,如果采用FragmentManagerattach/detach,会触发Fragment生命周期回调(onDestroyView),内部会把SurfaceView从view树上移除,从而触发onWindowVisibilityChanged,最终导致Surface被destroy,而调用show/hide并不会触发onWindowVisibilityChanged,所以不会导致Surface销毁。
▐
截屏
概述
从购物车切换到其他Tab时,保存购物车的截屏,再次从其他Tab进入购物车的时候,先显示截屏View,待SurfaceView开始渲染之后,再隐藏截屏View,显示SurfaceView。
效果
Tab切换不会闪,但截屏有API系统版本限制(Android 8.0,API 26)
方案细节
-
核心:SurfaceView从View树中移除,内部会销毁当次Surface,所以要想成功截屏必须在这个销毁动作执行之前。
-
截屏:在Tab切换Preload阶段/back键触发时截图,期间会卡主主线程(设置超时,如:100ms),在截屏完成之后(显示截屏兜底图),再切换Fragment
// 切换到非购物车Tab回调
private val mTabOtherCallback: ()-> Unit = {