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

为解决播放器功能耦合问题,本文提出将百度语音合成与变速播放功能解耦,通过封装工具类和自定义控件实现。讨论了如何避免主线程阻塞,采用后台服务绑定播放器,确保服务的单一性和面向对象设计。分析了服务生命周期绑定及扩展性实现。

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

内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值