如何抽离播放器功能业务,实现代码解耦?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013823101/article/details/89515141

目前发现文章详情页面的播放器功能,通过一个播放器功能接口耦合了百度语音合成和文章变速播放功能。需要对业务代码进行解耦,前提是不影响之前的业务功能,而且需要提供可扩展的功能。
第一,观察业务界面发现,百度语音合成可以直接抽取成一个播放器工具类,因为它的的实现原理其实只是集成了百度语音的语音合成功能,当用户点击播放按钮的时候,开始截取字符串顺序播放。界面的刚改可以在点击动作发生时对应处理,当停止播放的时候,也是需要通过用户点击播放按钮触发的,所以暂时可以不用考虑太多更改界面的接口回调,只是当文章顺利播放完成时需要去更改播放按钮的播放状态,并且释放播放器资源。
第二,中间变速播放的界面完全可以抽取成一个自定义控件,中间的进度条也可以抽取成一个自定义控件,因为业务功能需要实现语音的变速播放,这个功能因为是安卓6.0之后才支持,而目前项目只支持安卓5.0以上。所以变速播放功能我们找的是用腾讯SDK实现的,这样说来其实这也是一个第三方的SDK,功能代码其实也是可以抽取成一个播放器工具类,只需要提供播放、暂停、继续播放、变速播放等功能方法供外界调用就行,具体业务逻辑封住在这个播放器实现中去,我们并不关心,如果以后这个第三方实现需要换别的SDK,我们也只需要改动这个变速播放器的封装代码就行,其他的代码不需要任何改动。
然后我们想到了播放音频文件其实是一件耗时的任务,如果我们在主线程中执行播放,网络不佳的情况下,则会阻塞主线程,导致线程ANR.所以我们需要考虑一下使用开启一个后台服务去执行播放功能,而且这个播放功能是需要和播放器进行绑定的,这样的好处其实就是让播放器和播放服务的生命周期进行绑定,说明服务的功能的单一性,也是面向对象的设计思想。
其实我们发现绑定服务的过程中,我们可以通过Intent传递任何对象到这个服务里面进行绑定,这样其实也是有利用以后扩展的实现,因为以后如果需要实现更多不同功能的播放器,只要封装一个播放器工具类,然后实现播放的功能同时,开启一个服务进行绑定,然而服务里面该实现怎么样的功能呢?我们知道播放功能需要接收文章的文字,难道我们需要在播放器服务里面去实现播放器的功能代码?这样不就又是通过接口让播放器和播放器服务进行耦合了吗?
是不是播放器的功能一定需要通过接口进行耦合才能实现在播放器服务里面拿到一个播放器功能接口进行播放相关的操作。看起来通过接口来实现播放器的功能方法,然后把实现播放器功能的接口传到服务内,在服务李敏啊的onStartCommend()不断在后台执行的方法中做播放器播放、暂停、继续播放、退出的操作, 但是这里我们开启的播放器服务一直都是在后台执行的,并不是你停止播放,服务就结束了。那么我们这个服务该在什么时候结束呢?

展开阅读全文

没有更多推荐了,返回首页