在中国, 随着生活质量的不断提高, 人们运动健康意识逐渐增强。然而, 基础体育设施与场地的匮乏导致人们对户外健身的兴趣大大减少。并且, 时间日益碎片化也成为户外健身、健身房锻炼的另一大阻碍。
以下为本篇论文正文:
摘 要:该课题研究的是利用移动智能手机的特点打造一个能简单、循序渐进并且随时随地锻炼的健身应用软件。该软件参考囚徒健身法, 提供多种无器械的自重健身方法及其升级体系。论文给出了基于Android系统的健身软件的架构设计及开发示例, 该实例使用了分层合理且便于测试的MVP代码组织架构, 大胆采用高性能移动端数据库Realm作为数据存储方案, 图片加载组件则采用Facebook开源的强大且灵活Fresco框架, 网络通信框架选择了具有注解声明式特性的Retro-fit, 整个技术选型采用了许多功能强大并且非常可靠第三方开源库, 较大地减少了编写很多模式式代码, 使得开发者能更加专注于业务功能开发。软件能够提供丰富的健身动作图文及视频教程;带有超燃背景音乐的动作节奏计时器用于辅助动作训练;锻炼日记便于健身者查看训练成果。该软件现已在国内外各大应用商店发布, 通过用户反馈和使用效果来看, 软件可以让使用者灵活掌控时间和地点去进行更加个性化的锻炼。
关键词:移动健身软件; 健身应用; 囚徒健身; MVP; Fresco; Retrofit;
Abstract: The subject of this study is: the use of mobile smart phone features to create a simple, step by step and anytime, anywhereexercise fitness software. The software refers to the prisoner fitness law, providing a variety of non-device weight-based fitnessmethods and upgrade system. This paper gives the architecture design and development example of fitness software based on Android system. This example uses a hierarchical and easy to test MVP code organization, bold use of high-performance mobile data-base Realm as a data storage solution, image loading components are using Facebook open source powerful and flexible Frescoframework, the network communication framework has a comment Declarative features of Retrofit. The entire technology selectionuses a number of powerful and very reliable third-party open source library, a larger reduction in the preparation of a lot of modecode, making developers can be more focused on business function development.The software can provide a rich set of fitness action graphics and video tutorials; with rush background music action rhythm timer for auxiliary action training; exercise diary for fitness to see the training results.The software has been released at various app stores at home and abroad. Through user feedbackand usage effect, software can enable users to control time and place flexibly for more personalized exercise.
Keyword: mobile fitness software; fitness application; Convict Conditioning; MVP; Fresco; Retrofit;
在中国, 随着生活质量的不断提高, 人们运动健康意识逐渐增强。然而, 基础体育设施与场地的匮乏导致人们对户外健身的兴趣大大减少。并且, 时间日益碎片化也成为户外健身、健身房锻炼的另一大阻碍。这些因素导致人们在寻求一个更加方便、能随时随地健身的方式。
移动互联网健身成为人们日常锻炼的新选择。智能手机功能强劲、具有移动化的特点使其天然成为健身工具的载体, 健身应用软件有巨大的市场需求。
在几乎人人拥有手机且大多数人几乎没有专门的锻炼时间的年代, 健身APP可以让锻炼者充分地利用平时的闲暇时间来锻炼, 让锻炼者的运动变得“有模有样”, 收获运动的成就感。同时锻炼者只要打开健身APP就可以随时随地接受专业的健身指导, 免掉了去健身房和请专门健身教练的麻烦。这对健身者体育锻炼行为的促成和体育习惯的养成具有十分重要的意义[1].
巨大的市场需求也吸引众多厂商参与竞争, 市场涌现了类似Keep、火辣健身、每日瑜伽等健身APP.该类APP功能主要是指导力量、瑜伽、健美操等项目的练习。此类APP的功能除了为健身者视频指导教学等功能, 较为侧重健身社交。部分APP还可以为健身者量身定制训练计划, 以及提供饮食配方和相应的健身知识。
但是厂商为了追求收益, 设置了大而杂的训练课程体系, 功能模块涉猎得十分全面, 导致大量健身新手无从选择。并且, 在训练动作的选择上往往会倾向于需要器械的内容, 导致锻炼者无法实际使用。还有, 为了追求好看的活跃数据, 市面上的厂商都让应用流氓常驻内存, 使得用户手机的续航能力极大降低。因此, 无论是从用户的痛点还是应用的功能上来看, 市场的产品没有完全解决所有健身者的需求, 仍有问题可以有不同角度的解决方案。
在此背景下, 本研究提出利用移动智能手机的特点打造一个能简单、循序渐进并且随时随地锻炼的健身应用软件。旨在通过提供简单、有效的无器械的辅助健身, 使健身者进行个性化、个体化的运动锻炼, 提高大众的健康。
1、 软件架构设计
1.1、 软件功能模块
作者将软件命名为原力囚徒健身[2], 用户可使用软件进行训练辅助, 包括播放训练背景音乐、节拍喊数、训练强度建议、训练节奏设置;可查看健身教程, 包括动作详解、真人图片示例、视频示例;可记录和查看健身数据, 包括查看训练日记、数据统计汇总、训练感受记录。整体功能结构如图1示。
图1 产品功能结构图
1.2、 开发环境
作者选择Android Studio作为开发工具, Android Studio是一个基于Intelli J IDEA开发的一款Android应用开发工具, 功能强大, 易用性高。并且, 它采用Gradle作为编译工具, 非常方便开发者管理依赖包和自定义构建流程[3].
1.3、 架构选择
如果没有选择一个比较好的代码组织架构, 在后续的编码开发中, 很容易造成代码混乱, 各个代码模块权责不清。好的架构会遵循一定的模式, 按照一定的规则规范各个模块之间的权责与交互, 这样使得代码分布合理, 使开发人员更专注于业务逻辑。鉴于此, 作者选择了MVP架构作为整个项目的组织架构。
1.4、 技术选型
Android作为一种已经发展多年的平台, 一些通用的基础功能已经有很多久经考验、功能强大、易于拓展的开源库实现。了解并谨慎的选择这些第三方开源库, 有利于开发者避免重复地造轮子, 让其有更多精力来处理业务逻辑[4].
1.4.1、 数据存储
在数据存储存储方案的选择上, 作者做出了一个比较前卫的选择, 选择Realm作为数据库存储方案。
Realm是一个快速、易用并且免费的移动端数据库。它是一种新型的移动数据库, 是全新的, 从零开始研发的, 拥有非常多先进的特性[5]:
1) 专为移动端研发的全新数据库引擎, 性能十分优秀, 是SQLite的4~5倍。
2) 直接面向对象, 无需ORM转换, 这使得数据的定义与查询都非常便捷。
1.4.2、 图片加载与展示
由于Android系统自身的Image View默认不支持网络图片的加载, 并且对图片的解析也不够智能, 手动实现去异步获取网络图片并展示是一件比较复杂且容易出错的。所以, 作者选择了Fresco作为图片显示控件。它是Facebook开源的一款着名的Android图片加载框架, 可以帮助开发者快速实现网络图片加载功能。
1.4.3、 网络通信
作者选择了十分流行的Retrofit作为HTTP网络请求框架。它使用注解的方式来定义网络接口, 配合Rx Java, Gson可以方便实现网络请求, 帮助开发者节约精力[5].
1.4.4、 其他框架
使用Joda Time来处理时间计算问题;使用Butterknife实现View注入;使用Stetho来帮助网络、数据存储调试;使用LeakCanary来监测内存泄露。
2、 编码实现
2.1、 首页与动作列表页实现
首页不仅有主要的训练动作信息预览, 还是各个子功能的入口。首页和动作列表页两个页面的布局相似, 都是由列表构成, 这里将两者放在一起阐述其实现方法。
实现的难点是如何将列表数据设置到具体的样式上, 列表作者使用的官方在Support包中的Recycler View控件, 该控件使用适配器模式来实现数据与具体数据的映射。所以, 作者先需要编写Adapter.
这里作者定义Index Simple Adapter作为首页列表的Adapter, 让其继承Adapte<T>, 实现了其中的抽象方法。编写完Adapter后, 需要对Recycler View的列表形式进行设定。接着, 从数据库读取数据, 并通知Adapter数据更新。
2.2、 训练动作详情页实现
训练动作详情页会有训练动作的训练要点、训练部位等内容, 是一个布局和交互比较复杂的页面。
跳转到动作详情页需要传递必要的Action ID参数, 否则将会导致异常。为了保证其他页面跳转到详情页时必然会携带Action ID参数, 作者在Detail Activity创建了静态start () 方法。这样不仅保证了必要参数, 并且在参数类型或者个数改变的时候, 编译器可以帮忙检查处理, 方便修改。
然后在Activity on Create的时候使用get Intent () .get Int Extra () 获取Action ID, 获取Action ID后在数据库进行查询。
最后, 将查询的结果进行设置到对应的控件上即可。
2.3、 节奏辅助训练实现
节奏辅助训练模块是整个应用中最核心、最重要的功能, 整体逻辑十分复杂, 具体流程如图2所示。
图2 辅助训练模块流程图
2.3.1、 背景音乐播放
音乐的播放可以使用系统的Media Player类提供的API进行播放。为了能在后台进行播放, 需要将Media Player放到Service中, 并在Service中编写相应的播放控制方法, 便于Activity进行调用。
Service与Activity交互需要通过IBinder进行, 定义BgmBinder让继承于Binder, 然后定一个方法供Activity获取当前Service实例。
然后在Service的on Bind () 时返回Bgm Binder实例, Activity可以通过初始化时和Service进行绑定, 调用其get Service () 获取该Service实例, 通过实例Activity就可以调用Service的方法, 从而实现对背景音乐播放的控制。比如可以调用m Bgm Service.play () 播放指定路径的音乐;调用m Bgm Service.pause () 暂停播放。
2.3.2、 喊数音频播报
当计时器发生回调时, 仅仅产生倒计时参数, 播放对应的数字音频。Media Player的创建和销毁都是非常消耗资源的, 它播放一些短促而且频繁播放的音频的话, 就有些不合适了。这里作者使用系统提供的另外一个音频播放API:Sound Pool进行喊数音频的播放。
Sound Pool播放需要预先加载到内存中, 作者选择在界面初始化时进行加载。然后在需要播放音频的地方只需要调用相关代码, 即可对相应音频进行播放。
2.4、 网络通信实现
网络请求通信使用的是Retrofit, Retrofit通过注解的方式, 将接口的定义转换成Java的接口定义, 自动实现通信处理。
接着需要实例化Retrofit实例, 这里需要指定通信Host.由于作者的接口返回数据类型是JSON, 所以Retrofit实例化时再指定数据处理的插件Gson Converter Factory实例, 该插件会自动将API返回的JSON反序列化成对应到Object.
最后调用接口, 在对应的回调方法中处理对应的逻辑。
2.5、 训练日志实现
该模块可以让用户查看、编辑每天的训练感想, 涉及数据查询与写入。
所有的写操作, 必须包含在写入事务中, 在提交期间, 所有更改都将被写入磁盘, 并且, 只有当所有更改可以被持久化时, 提交才会成功。
3、 测试与发布
3.1、 兼容性测试
Android版本、手机品牌、分辨率基本上是百花齐放, 兼容问题不可避免, 作者使用了第三方服务进行兼容性测试[6].
原力囚徒健身在多个云测服务测试后均通过。
3.2、 正式发布
作者为了更好地验证想法, 将产品发布到小米、魅族、应用宝等商店, 在这些商店搜索原力囚徒健身, 即可下载。
截至2017年12月1号, 已经累计13万多用户。
4、 结束语
为解决因时间和空间等限制造成的健身问题, 研究并实现了基于安卓手机的健身应用软件。经测试和发布后的结果表明, 用户可充分利用闲暇时间使用该软件, 来进行高质量、个性化且专业的健身锻炼, 得以保持身心的健康。该软件选用的MVP架构, 将需要Runtime的代码进行了隔离处理, 极大地提升了编码、测试的开发循环的效率。选择Realm作为数据库存储方案, 提高了数据的存储和读取的速度、稳定性以及可靠性。利用Fresco实现了快速、智能的网络图片加载功能, 利用Retrofit实现了更加方便的网络请求。通过最终测试结果及软件正式发布后的用户反馈, 充分证明了本软件的实用性及易用性。
参考文献:
[1]王丽, 倪朝民。体力活动能量消耗的测量方法及其应用[J].安徽医学, 2011, 32 (6) :849-851.
[2]张瀚夫。囚徒健身法[J].体育博览, 2013 (12) :76-79.
[3]Google.Android Developers Getting Started[EB/OL].https://de-veloper.android.com/training/index.html.
[4]Eckel B.Thinking in JAVA[M].Prentice Hall Professional, 2003.
[5]张孝祥。Java就业培训教程 (附盘) [M].北京:清华大学出版社, 2007:1-150.
[6]Simon J.Head first Android development[M].O'reilly, 2011.