「这是我参加2022初次更文应战的第11天,活动详情检查:2022初次更文应战」。

前语:

也许咱们也会遇到播映器过于臃肿,播映器操控逻辑复杂度高,事务耦合度高,页面逻辑涣散(跨页面动画,续播逻辑)等等这类问题,而这些问题其实归根到底就是播映器自身没有“干(播映器自身)湿(播映器操控)”别离。假如产品中的播映器形状多样化,那么在这个播映器中新增某些需求起来也是极其困难,往往牵一发而动全身。所以需求对播映器进行事务别离,把播映器中心事务以及UI操控层进行抽象化,然后削减相互之间的依靠联系。

播映器重构之路

背景

我所做的项目之前的事务重心一直在社区和社交方面,在视频日记以及长视频做了许多尝试,做了许多差异化的处理,起先的播映器是由一个根底类,渐渐演变到多个继承类,而后在产品的优化需求中一直打补丁,加入了许多小功用,比如说:手势快进,列表滑动播映优化,续播,网络条件下的自动播映等;项目在起先的时分没有考虑全体的播映器架构,导致后期播映器的逻辑严峻依靠页面,以至于后期的事务变更难以继续,呈现的问题也难以处理。(新人看了不敢乱动,旧人看了一眼,祖传“屎山”,千万别动)

探究

在经过满意耐性的分析之后,在项目中发现了多个层面存在问题:

  • 播映器的交互部分与事务上的UI耦合在一起,并且多个事务层模块依靠这个根底的播映器操控层,往往某一处修正,影响都是成倍的。
  • 列表播映时,太多重复性的侵入代码
  • 续播逻辑过于复杂,由于起先的续播计划建立在打补丁的根底上,所以计划不合理;
  • 底层播映器的架构存在问题,没有和事务完全别离;

已然发现了问题,那么怎么去规划播映器模块的架构呢?或许说什么样的架构满意自身的事务呢?

那么依据自身的事务需求然后拟定了一些必须要满意的条件:

  • 播映器底层是否需求满意不容内核的播映器avplayer、ijkplayer或许更多;(需求有一致的播映器适配协议)
  • 播映器操控层是否需求完成差异化的处理;(需求有一致的操控层协议)
  • 播映器列表自动播映的完成计划与事务别离;(需求经过协议的形式或许tableView的分类完成解耦)
  • 播映器手势一致办理;(手势合集)

实践

已然知道了要怎么满意哪些条件,那就放手去做吧。

遵循规划形式的六大原则,咱们尽可能将每个类的责任单一化,把底层依靠的模块抽象化,然后到达上层事务最大的灵活性。

播映器架构

播放器重构的探索之路

VideoPlayerCenter

VideoPlayerCenter类是中间操控层,它的责任是用来整合一切的模块,将播映器中的事情(播映器自身的事情、或许主动触发操控层的事情、或许网络层面监测的事情等)分发给对应的功用模块,你能够把它当做一个调度。

以下是VideoPlayerCenter的结构:

播放器重构的探索之路

VideoPlayerCenter会对外开放各个模块的方法来处理,每个新增的模块能够经过增加分类的方式去增加自身的功用完成。

在这个类中,会把各个功用模块组装,然后依据每个功用模块的回调触发到对应的功用模块,比方说:

VideoPlayerPlaybackProtocol的完成类中有播映器的播映回调,假如触发该回调之后,会在VideoPlayerCenter中转发事情到VideoPlayerControlProtocol的完成类controlView中,用于处理播映回调后的操控层UI变更;

VideoPlayerGestureManager类中有播映器的手势回调,假如触发该回调之后,会在VideoPlayerCenter中转发事情到VideoPlayerControlProtocol的完成类controlView中,用于处理手势操作后操控层UI变更;

同样VideoPlayerNetworkManager类中也是相同;

VideoPlayerPlaybackProtocol

VideoPlayerPlaybackProtocol类是播映器的操控层,它的责任是用来抽象播映器,削减外界对播映器的依靠;

这个类会界说播映器的基本属性,方法,回调,用于一致播映器的接口,在接入不同的播映器时,只需求完成对应的这套播映器协议即可使用。

VideoPlayerControlProtocol

VideoPlayerControlProtocol类是播映器的UI操控层,它的责任是用来抽象化UI层的事情,削减外界对播映器的依靠;

VideoPlayerCenter中的controlView就是这个VideoPlayerControlProtocol协议的完成类,同时controlView自界说自己的布局,在页面切换的时分能够直接经过切换controlView就能够完成播映器的过度。

这个类会界说操控层一切的事情,一切可能会影响到操控层的事情都会经过VideoPlayerCenter转发到VideoPlayerControlProtocol的完成类中。

VideoPlayerGestureManager

VideoPlayerGestureManager类是播映器操控层的手势办理,它的责任是办理操控层的手势;

手势品种有许多中,能够单击,双击,长按,拖拽等,呼应哪一种手势取决于装备;

VideoPlayerNetworkManager

VideoPlayerGestureManager类是播映器的网络监测,它的责任是监测网络动摇;

每个类的责任划分是单一的,不会去干涉其他类的逻辑。经过对操控层的抽象化,处理了操控层差异化的装备,处理了列表播映切换至详情页播映的的无缝续播,处理了上层事务对播映器的过度依靠,极大程度的保证了事务层的干净整齐。

后续

由于播映器的事务侧做了许多减法,现在的这些功用类现已满意需求。列表自动播映的逻辑是在tableview的分类中(能够复用本来的逻辑),并没有放在VideoPlayerCenter中办理,有违最初规划的初心,假如后边要把播映器模块化,可能会有些影响,后边在考虑下是否要把列表播映也放在VideoPlayerCenter中。后续会继续完善切换横竖屏,以及操控层的手势快进、快退、长按三倍速等相关的功用。