《科学脱口秀》Android端的设计与实现

2017-09-08 07:31金伟阳
长春大学学报 2017年8期
关键词:离线客户端按钮

谭 璐,金伟阳

(长春大学 计算机科学技术学院,长春 130022)

《科学脱口秀》Android端的设计与实现

谭 璐,金伟阳

(长春大学 计算机科学技术学院,长春 130022)

阐述了可基于Android、JAVA和Realm在移动端设备上运行的应用程序。这个应用程序主要实现了播客节目分类显示、播客节目在线播放、播客节目离线缓存播放、博客节目模糊查询、播客节目介绍查看、播客节目评论查看、通知栏/线控控制音乐播放、来电/短信勿扰和播客节目收听/点击热度统计等功能,满足用户对该播客节目收听的基本需求。

Podcast; Android; Realm; MediaSession; Martial Design

0 引言

2009年,Android首次进入中国,其火热程度一直在持续上升。2011年的第一季度,Android在全球的市场份额第一次超过塞班系统,成为全球第一。在2013年的第四季度,Android手机平台的全球市场份额已超过78.1%。最近3~4年,国内Android的发展也异常迅速,并在国内形成一定的体系,拥有众多出色的APP,Android手机也成为人们日常不可或缺的工具、娱乐设备。

《科学脱口秀》这档节目,2012年6月首次在podcast开播,近年来,知名度不断提高,为科学、科普、知识提供了新颖的传播方式。节目号称用无下限的方式传播科学知识,吐槽流言,小到菜市场大到宇宙末日。植物、动物、天文、心理、物理、化学各路知识全面包含。该节目最开始仅在苹果的iTunes上发布,只能通过苹果设备收听,随着Android的普及,Android设备市场占有率也超过了苹果,该节目也在各大听书平台上架,随后官方网站也在听友的帮助下上线了。但是,由于商业原因,各大听书平台布满了广告,在节目播放期间强行插入音频广告,十分影响收听。因此,一款纯净无广告、能满足基本收听功能的APP是犹为有意义的。本文就针对于这个需求,在Android音频播放、文件下载等方面进行了研究。

1 系统分析与设计

整个软件主要分为6个基本模块,每个模块具体功能如下:

(1)在线/本地播放模块。主要是由自行抽离出的音频播放SDK构成,仅用于负责播放以及通知栏的显示,通知栏能够对播放进行控制,并支持多种配置,SDK遵循谷歌MediaSession框架,能够和系统进行结合,接收系统发出的不同指令。

(2)文件缓存模块。抽离出特定功能的下载SDK,负责文件下载,SDK支持配置下载默认路径、下载最多支持的线程数、是否断点续传。并且能缓存下载进度,下载队列,以及下载的排序。提供了批量下载取消/下载暂停的接口。

(3)搜索模块。提供相关字段的模糊搜索功能,且搜索是随输入实时进行,之后将搜索出来的结果展示在界面上,供用户选择。

(4)评论展示模块。用于展示评论,根据不同的节目获取不同的评论展示在界面上,不过由于节目官网系统原因,不支持评论以及评论回复。为了满足一些人需求,提供了复制评论的功能。

(5)数据爬取解析模块。是较为重要的模块,该模块分为两块,服务端使用WebMagic进行网页爬取,使用PULL进行RSS解析,并使用七牛云保存静态资源。而客户端的数据爬取解析模块为备用方案,在七牛云失效时使用,通过Nohttp获取RSS,为了保持两端统一,同样使用PULL进行解析。

(6)数据存储读取模块。主要是将爬取解析获取到的数据缓存至本地数据库,本APP使用存储读取效率较高的Realm数据库。由于Realm的特性,可以不写sql语句而是通过类似sql的方法进行查询、存储。但是,Realm数据库不允许跨线程访问,因此,也造成了很多困扰。

2 数据库的概念结构设计

在数据库中建立4个数据库表,分别是科学脱口秀表、节目表、缓存节目表、评论表。这些表支撑起整个软件的数据基础,存储着关于节目的数据。涉及到的具体的数据库表如下:

(1)科学脱口秀表(ScienceTalkShow):存储科学脱口秀节目组的主要信息,包含节目组名、节目组副标题、节目组官网链接、节目组图像、节目组所属语言、节目组相关描述等。

(2)节目表(Programme):存储科学脱口秀节目的主要信息,包括唯一标识、节目标题、节目官网链接、节目发布时间、节目发布者、节目所属类别、节目描述、节目说明等。

(3)缓存节目表(ProgrammeCache):存储缓存在本地的节目信息表,包括唯一标识、节目标题、节目创建者、节目所属类别、节目本地缓存文件存储的路径。

(4)评论表(Comment):存储节目对应的评论信息,包括唯一标识、评论标题、评论节目官网链接、评论发布的时间、评论者昵称、评论简述、评论内容。

3 相关理论基础

3.1 MediaSession框架

要了解MediaSession框架就得先从MediaPlayer的生命周期和状态讲起,Android的MediaPlayer包含了Audio和video的播放功能,在Android自带的软件中,Music和Video两个应用程序都是调用MediaPlayer实现的。MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

一个MediaPlayer对象包含以下几种状态:

(1)当使用刚刚创建的MediaPlayer对象new或之后reset()被调用时,它是在空闲状态;

(2)当调用release()之后,它处于结束状态;

(3)在一般情况下,一些播放控制操作可能由于不支持的音频格式,交错的不良音频,流超时等各种原因产生一些错误报告。因此,错误报告和恢复是在这种情况下的一个重要问题。而且,有时由于在无效状态下调用重放控制操作这种编程错误也会产生错误报告。此时,MediaPlayer对象处于错误状态。

(4)在执行setDataSource()时,MediaPlayer对象从空闲状态到初始化状态。

在MediaSession框架中,有一个受控端和一个以上的控制端。接下来为了保证受控端和控制端相互之间的匹配,就有了SessionToken的概念。在MediaSession框架中,这是最重要的概念。

3.2 RSS技术

RSS(Rich Site Summary)是一种网络供稿,它允许用户访问标准化在线更新内容,是一种计算机可读的格式。这种内容的传递被称为网络聚合。网站通常使用RSS feeds来发布频繁更新的信息,例如博客文章、头条新闻、音频、视频。一个RSS文件(称为“feed”,“web feed”,或者“channel”)包括完整或概括的文本和元数据,如出版日期和作者姓名等。

RSS是一个标准的XML文件格式,确保与许多不同的机器/程序的兼容性。RSS feeds也有利于用户从喜爱的网站,或从许多网站汇总数据得到及时的更新。

4 技术选型

4.1 网络请求框架选型

市场上有很多网络访问库可供选择,OkHttp、Retrofit、Volley、NoHttp、HttpClient、HttpURLConnection等都是较为成熟的网络请求框架,其中HttpClient和HttpURLConnection都是网络请求的基础库,并且HttpClient在Android 6.0之后已经从系统底层被移除了,因此在底层库上选择HttpURLConnection。

NoHttp是一个开源的项目,在国内有着一定的影响力。支持与Rxjava相结合,支持切换OKHttp底层,支持将缓存保存至本地(数据库或文件),并且自动加密缓存文件。由于是国人开源的一个项目,因此文档描述更符合国人的逻辑,使用习惯也和国人的习惯更类似。

最后选择了NoHttp作为本项目的网络请求框架,并且拥有着不错的体验。

4.2 数据库选型

数据持久化几乎是所有APP都会涉及到的功能,通过将云端获取的数据保存至本地,可以减少APP请求网络的次数减轻服务器压力,同时也可以在无网络或弱网络的情况下展示有效界面。

在Android中数据存储主要有四种比较常见的方式:

(1)SharePreferences。其本质是一个XML文件,通过键值对的形式保存数据,由于本质就是读取写入文件,因此这种数据存储只适合一些类似配置信息的小数据存储,而对于动辄2~3M的数据就会影响数据的读取写入速度(特别是对于一些存储器件还是前几代产品的老机器)。

(2)数据库。在Android中内置的数据库是一个轻量级的数据库SQLite,不具有数据库用户概念,它支持基本的SQL语法,并且Android也为其提供了一个SQLiteDatabase类用于数据库的访问。SQLite也是Android上使用最广泛的数据库。

(3)Contert Provider。是Android四大组件之一,顾名思义,它可以为APP提供内容,可以通过ContentResolver接收封装好的数据。不过,Contert Provider只用于程序间的通讯,如果只是用于当前程序使用,建议使用其他三种存储方式。

(4)File。文件存储(也叫做I/O存储)是最常用的数据保存方式,无论是在PC或者服务器中,始终有着其独有的优势与作用。在Android中,文件存储主要用于一些超大数据的存储,类似图片资源、游戏数据包等都是使用文件存储,当然由于是整读整写的特性,导致它更新数据,删除部分数据时效率极其低,因此对于一些经常改动的数据,不建议直接保存在文件中。

经过多方对比,结合APP本身的需求,最终选择使用数据库存储节目数据,使用SharePreferences存储配置信息。随着对Android上数据库的深入研究,发现在市面上不止有SQLiteDatabase这一种方式。能在Android上使用的还有OrmLite、SugarORM、GreenDAO、Realm等,而GreenDAO和Realm又是目前比较受欢迎的两种数据库存储方式。

GreenDao是一个很好的解决方案,它能够支持每秒数千条记录的增删改查,和OrmLite相比,GreenDAO要快几乎4.5倍,而且GreenDAO体积只有不到100kb,对于APP本身大小影响很小。

Realm是另一种解决方式,它是一个 MVCC 数据库并非使用SQLite数据库,底层用C++编写。由于在编译时,Realm被直接编译成机器语言,因此在运行时具有更高的效率。

为了比较这两个数据库的速度,做了如下测试(纵轴单位毫秒):

图1 数据插入耗时对比图

由图1可以看出,在数据插入时,前期GreenDAO和Realm差别不大,随着数据量的增大,Realm消耗时间增加不大,而GreenDAO却呈现指数式增长;不过在删除数据时则有不同的表现,当数据超过1000条之后,Realm消耗的时间急剧上升,而GreenDAO则相差不大,增长缓慢。综合上面的统计,Realm的优势在于插入和查询,这正符合本项目对存储性能的要求,因此最终选择Realm。由于Realm的访问必须保持在同一线程种,经过研究,最后结合RxJava解决不同线程间数据库访问的问题。

5 系统功能实现

本章将对在线收听功能、节目缓存功能、离线播放功能、搜索功能和评论展示功能来介绍这个软件。

5.1 在线收听功能

如图2所示,用户可以在在线播放界面查看到播放进度,可以拖动进度条调节节目进度,也可以通过底部两侧的按钮微调进度。底部中间的按钮很显然也可以进行暂停、播放操作。在进度条的上方有三个按钮,分别是节目详情、节目缓存、显示评论功能。如图3所示,就是点击节目详情后出现的界面,用户可以点击“×”或空白区域,隐藏详情页。此外,在播放界面右上角有一个隐藏选项跳转官网,可以使用系统浏览器打开节目对应的官方网站。

图2 客户端在线收听界面UI图

图3 播放界面节目详情界面UI图

5.2 客户端节目缓存功能实现

客户端所需要的数据是各分类缓存节目数、下载的状态和下载的进度。在数据库设计时就有缓存节目表,通过对表内数据的查询,可以分析出各个分类缓存节目的数量。

客户端将不同分类的缓存节目显示在当前界面,考虑到文件可能被手动删除的问题,每次数据取出后,都需要在本地文件中扫描一次,查看缓存文件是否存在,若文件存在则显示,若文件已被删除则删除数据库中的记录,也不会显示在列表中。

5.3 客户端离线播放功能实现

离线播放界面与在线播放界面很类似,唯一的区别是离线播放界面的下载按钮无法使用,显示已下载。其他按钮的功能与在线播放界面相同。左上角的返回键可以返回到进入本界面之前的界面,而右上角也隐藏着一个去往官网的按钮。底部的三个按钮分别是快退、播放/暂停、快进。进度条会显示播放进度,并且可以通过进度条控制节目播放的进度。进度条上的三个按钮同样也是节目详情、下载、跳转评论界面,当然就像上面提到的,下载按钮在离线播放的情况下是无法点击的。

5.4 客户端搜索功能实现

搜索界面是从主页右上角的搜索按钮点击进入的,界面简洁只有返回键、搜索框、搜索内容清空按钮。点击返回键返回到上一界面;点击搜索框弹出输入法,可以输入想要查找的关键字;而右侧的按钮点击后可以将搜索框内的内容清空。而在停止输入时,则会显示搜索到的相关节目,节目显示简要信息,以标题、发布者为主。点击即会进入在线/离线播放界面进行播放。

5.5 客户端评论展示功能实现

界面上显示当前节目的评论,节目信息中主要包含当前评论楼层数、评论人用户名、评论发布时间、评论发布的内容。在获取数据时,显示获取状态Dialog,提示用户等待。在无数据时,显示无任何评论。由于某些情况的需求,当长按评论时,将评论内容复制到剪贴板,并Toast提示已成功复制该条评论,复制的评论内容可用于他用。界面整体遵循Material Design设计理念,在点击每条评论时,都会有一个水波纹涟漪效果。

6 结语

本论文针对《科学脱口秀》这一档播客节目Android客户端的需求,结合市面上多款同类APP的特性和交互,借鉴MaterialUp网站大量的界面设计,总结出了一套全新的界面和交互。并且,调研了多个市场广泛使用的技术,选择了最符合本项目,且较为稳定经过市场考验的几项技术,结合最新官方推荐的成熟的开发工具,开发了该软件。

该软件实现了预定的收听播客节目的需求,其包括在线收听功能、节目缓存功能、离线播放功能、节目搜索功能、节目评论展示功能,解决了之前在Android端收听体验不佳的问题。提供了一套完整的功能,能够让用户随时随地收听节目,没有任何广告打扰,也没有其他无用推荐,只做用户想要的。

[1] C.J.Date.数据库系统导论[M].北京:机械工业出版社,2007.

[2] 许艳萍.Android智能终端安全综述[J].通信学报,2016, 37(6):169-184.

[3] 卿斯汉.Android安全研究进展[J].软件学报,2016, 27(1):45-71.

责任编辑:程艳艳

Design and Realization of “Science Talk Show” at Android End

TAN Lu, JIN Weiyang

(College of Computer Science and Technology, Changchun University, Changchun 130022, China)

This paper discusses the application program running on mobile terminal equipment based on Android, JAVA and Realm, which mainly realizes the functions of iPod+broadcasting programs such as the classification display, online play, offline cache play, fuzzy query, introduction and view, comment browsing, notification column or wire-driven control music play, disturbance for incoming telegram or short message and statistics for listening or clicking rate, etc., satisfying users’ basic requirement to listen to the iPod+broadcasting programs.

iPod+broadcasting; Android; realm; MediaSession; martial design

2017-07-20

谭璐(1976-),女,吉林长春人,讲师,硕士,主要从事计算机科学与技术应用方面研究。

P315.69

A

1009-3907(2017)08-0025-05

猜你喜欢
离线客户端按钮
当你面前有个按钮
异步电机离线参数辨识方法
浅谈ATC离线基础数据的准备
如何看待传统媒体新闻客户端的“断舍离”?
FTGS轨道电路离线测试平台开发
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路
离线富集-HPLC法同时测定氨咖黄敏胶囊中5种合成色素
死循环