Android开发三剑客——UML、模式与测试(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-14 11:24:36

点击下载

作者:王家林

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Android开发三剑客——UML、模式与测试

Android开发三剑客——UML、模式与测试试读:

前言

设计、编码、测试是Android项目实施的三个黄金阶段。

Android应用开发人员如何提升功力,从而成功地成为高级工程师或者架构师呢?

这是任何一个渴望提升Android应用的开发人员都很关心的问题。

那么,您精通UML吗?您精通设计原则和设计模式吗?您精通Android的测试驱动开发吗?

UML和设计原则、设计模式是成为架构师的必备基本功,某种程度上来说,一个Android应用开发工程师如果开始学习UML和设计原则、设计模式,就已经表明他想成为一位架构师了。Android测试驱动开发可以极大地推动他成为Android高级工程师,他编写的代码将更加有效、精确、强壮,将更利于您的团队协作。

本书即是为满足Android开发人员上述渴求而著的。

1)上篇对UML在Android开发过程中的应用进行了细致的分析

UML是面向对象分析与设计时的行业标准,在谈面向对象的分析、设计时就不能不谈UML。

解读Android的最佳指导思想就是面向对象思想,无论是应用程序框架还是HAL,都是在面向对象思想的指导下来实施的。

Android的产品开发已经有四年多的时间,在这四年多的时间里,全球的各大厂商和工程师全力投入,创造出了无数多姿多彩的产品和应用程序。然而遗憾的是,一直以来,Android产品开发(尤其是应用程序的开发)的混乱是众所周知的,现在是要改变的时候了。

Google已经为改变而做出了重大行动,尤其是Android 4.0的推出,制定了很多产品和程序开发的标准。对软件工程师而言,使用UML规范整个程序的开发,是最佳的选择。

本书上篇以一个重量级的案例——Android多线程断点续传下载器为例,细致剖析了每一个细节,读者稍加改造即可做出Android平台上的文件下载器。书中以Android多线程断点续传下载器为例,细致入微地讲解了UML的9种图(Diagram):用例图、类图、对象图、组件图、部署图、时序图、协作图、状态图、活动图。

对上述9种Diagram细致的学习,可使读者在分析、设计、开发Android程序时如虎添翼,游刃有余。

2)中篇的核心在于设计原则和设计模式

历史已经证明:Android是一个“气象万千”的开放式系统。就技术角度而言,对模式淋漓尽致的应用无疑是其内在的最为重要的原因之一。

Alexander在《建筑的永恒之道》中给出的模式的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,并描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无须再重复相同的工作。

从一般意义上讲,模式包括架构模式、设计模式、编码模式或者语言惯例。

何谓设计模式?设计模式是在某种情境下,针对某种问题的典型、通用的解决方案。这里的关键词如下。

● 情境:在特定情境下反复出现的情况,要求使用模式必须分析清楚事实;

● 问题:一般来说,就是你要实现目标或要解决的目标;

● 解决方案:典型的、通用的解决方案,应是引人深思和举一反三的解决方案。

设计模式是被发现的,不是被创造的。

设计模式来自哪里?当然是来自人类和宇宙相互的作用。它是人类长期为追求更加美好的生活而获得的经验和智慧的结晶。

其实,模式理论的基本思想起源于中国。每一个炎黄子孙的身体里都流淌着模式的血液。模式充斥于中国历史和现实生活中各个方面,无孔不入!《孙子兵法》中到处都是模式,当然也包括设计原则。“置之死地而后生”就是其中的一种模式,三十六计中的“美人计”、“欲擒故纵”都是模式。现在这些模式都成了古今中外各行各业研究学习的对象。据说美军攻打伊拉克的时候就使用了《孙子兵法》中的很多战争模式。

医学中也是如此,如扁鹊的“望闻问切”。望,指观气色;闻,指听声息;问,指询问症状;切,指摸脉象——合称“四诊”。“望闻问切”是中医看病的一般步骤。这是不是很像模板模式呢?

当然诸多模式也可以联手,开发中如日中天的MVC模式就是设计模式联合优化的一种模式。当然,准确地说,MVC不能说是设计模式,因为MVC划分的维度过大,MVC属于架构模式。

在模式中,在一些比较重要的场合或者一个比较重量级的书中,你可能时不时地听到“力”这个关键字,不要被“力”搞糊涂了!按照笔者的理解,“力”是实现目标的约束条件,这种约束条件可能把你带向光明的一面——实现目标,也可能带入痛苦的深渊——远离目标。

其实每一种事物都是在各种力的相互作用下存在和发展或者毁灭的。正如地球的外貌是各种相互作用的结果一样,软件分析、设计、开发、测试及维护的各个阶段也都是各种力相互平衡的结果。

Android就是一个淋漓尽致地应用了各种模式的系统,如Facade Pattern、监听器模式、适配器模式、单例模式、代理模式,等等;正是由于这些模式的应用,为Android增添了无限的风韵,也支撑了Android自身的开放性。

3)下篇对Android开发中的测试问题进行了详细的阐述

JUnit的口号:Keep the bar green to keep the code clean。(1)单元测试只是证明你没有错,但并不能够证明你是对的;(2)要想最大程度地证明你是对的,必须精心设计和编写测试用例(Test Case),尤其要注意测试时的边界值和特殊情况等;(3)单元测试主要用来判断程序执行的结果与预期的结果是否一致;(4)单元测试不能够改变源代码。

任何规模稍大的公司,它在软件部门都至少会有两个至关重要的子部门:

● 软件开发部门;

● 软件测试部门。

一般而言,开发和测试是由不同的人负责的,这是传统意义上的测试。随着测试驱动开发理念的发展和普及,尤其是敏捷思想的风靡,测试的重要性日益增长。在测试驱动开发的实践中,先由软件开发工程师编写好测试代码,然后才编写真正的实现代码。

由上面的内容可知,测试是何等的重要!

对测试还不了解的朋友可能会感觉非常奇怪:为什么是先编写好测试代码,然后才编写真正的代码呢?一般情况下不是先编写好代码,然后才对代码进行测试的吗?如果连代码都没有编写,那测试什么呢?

答案:此处的测试主要指以单元测试为基础的测试。

单元测试是需要软件开发部门去完成的,而不是测试部门。

在开发软件的时候,我们通常都是多人协作去完成一个项目。既然是多人协作,就必然涉及分工,具体到每个人会完成该项目的不同部分,而且部分和部分之间会有交互关系,一个工程师要完成的部分可能需要另外的工程师提供的代码服务。

基于协作的团队工作,就提出一个要求:如何确保我提交给其他工程师的代码是正确的?

答案:单元测试。

对,在把自己的代码提交给项目组的其他人之前,必须编写单元测试,来测试自己所提供的接口和功能的正确性。

单元测试的另外一个好处:这是最好的代码使用说明书。

本书代码包可在电子工业出版社官网(www.phei.com.cn)下载,也可通过微盘进行下载(关注http://weibo.com/pheicombook,进入微盘下载。)扫描封面二维码,即可进入相关网址。

希望本书可以帮助Android应用开发工程师提高设计和测试能力,开启通往高级工程师、架构师之路。

王家林

上篇 UML

UML 是面向对象分析与设计时的行业标准,谈面向对象的分析、设计时就不能不谈UML。

对软件工程师而言,使用UML规范整个程序的开发,是最佳的选择。

第1章 项目分析

1.1 为什么要选择Android多线程断点续传下载器作为本书讲解UML时的项目

Android多线程断点续传下载器涉及了Android应用开发大部分的核心知识点和难点:(1)Android中主线程和非主线通信机制:Handler、Looper、Message、MessageQueue。(2)多线程的编程、管理。(3)Android网络编程。(4)IoC技术,自己动手实现设计模式中的Listener模式。(5)Activity、Service、数据库编程等。(6)文件系统。(7)缓存。

本章用一个项目去贯穿整个Android项目的学习,理论和实践相结合,设计和编码并举。

1.2 细致剖析Android多线程断点续传下载器

首先看一下多线程断点续传下载器的运行效果图,如下图所示。

其实上面运行效果的基本原理如下图所示。

1.Android多线程的实现思想(1)可以根据记录当前的下载位置,实现断点下载。

如果现在需要下载一个大小为29 MB的文件,当下载到5 MB时,临时有事情,关闭之后普通的下载器不能帮助我们继续下载,而是必须重新开始,而多线程下载器(如迅雷)可以帮助我们记录下上次下载的位置,当再次下载时可以从记录的位置继续下载。(2)下载速度快。

使用多线程下载文件可以更快地完成文件的下载,多线程下载文件之所以快,是因为其抢占的服务器资源多。假设服务器同时最多服务100个用户,在服务器中一条线程对应一个用户,100条线程在计算机中并非并发执行,而是由CPU划分时间片轮流执行,如果A应用使用了99条线程下载文件,那么相当于占用了99个用户的资源。假设一秒内CPU分配给每条线程的平均执行时间是10 ms,A应用在服务器中一秒内就得到了990 ms的执行时间,而其他应用在一秒内只有 10 ms 的执行时间。就如同一个水龙头,在每秒出水量相等的情况下,放 990 ms的水肯定比放10 ms的水要多。

实现多线程操作的可以分为:

● 取得网络连接;

● 初始化多线程下载信息;

●“开辟”硬盘空间;

● 将网络数据放入已申请的空间中;

● 关闭资源。

通过下图来加深对多线程的理解。

此文件的大小是6 MB,共有三条线程同时进行下载,实现过程如下所示。(1)首先要根据要访问的URL路径去调用openConnection()方法,得到HttpUrlConnection对象。HttpUrlConnection调用它的方法得到下载文件的长度,然后设置本地文件的长度。

可以使用RandomAccessFile随机访问类。

RandomAccessFile和File的区别:

RandomAccessFile将FileInputStream和FileOutputStream整合到一起,而且支持将从文件的任意字节处读或写数据,File类只是将文件作为整体来处理文件的,不能读写文件。

调用setLength(filesize)方法设置文件的长度,file可以达到下载文件的长度,但是它的内部不存在我们要下载文件的的数据,而是File类的特有的一些初始化的数据。(2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。例如,文件的长度为6 MB,线程数为3,那么,每条线程下载的数据长度为2 MB,每条线程开始下载的位置如上图所示。

需要计算每一条线程需要下载的长度、每条线程下载的开始位置。例如,如果每一条线程是2 MB,那么第一条线程就是从0开始,第二条就是从2开始,以此类推。

但是这样就引出了一个问题:在下载时,怎样去指定这些线程开始下载的位置呢?

HTTP协议已经为我们解决了这个问题,它可以给我们提供一个Range头。(3)使用HTTP的Range头字段指定每条线程从文件的什么位置开始下载,例如,指定从文件的2 MB位置开始下载文件,代码如下所示。

我们设置的请求头Range字段,就是bytes=2097152,2 MB的字节,比如说指定了上图的线程2,在下载的过程中只要设置了这个头,那么它就会从文件的A→B开始下载。

每条线程在各自的文件下载完之后,需要将下载完的文件保存到一定的位置。这样就引入了RandomAccessFile类。(4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的一定位置开始写入数据。

下面的代码就可以指定从文件的什么位置开始写入数据。

用时序图演示在此工程中实现多线程、断点下载的思路,每条线程负责写文件的某一段的数据,如下图所示。

整个工程的结构图如下图所示。

多线程、断点实现过程如下:(1)首先设计main.xml页面,当在DownLoadActivity.java中单击下载按钮时,就会触发其单击事件,在单击事件内部中调用download()方法用于实现下载功能。(2)编写实现下载的download()方法,并在方法内开启一个线程,在其run()方法中“new”FileDownloader类。返回下载文件的大小和已经下载的数量。

● 在FileDownloader类中构造线程下载器。

● 在download方法中调用FileService类中操作线程的下载记录业务方法,得到各个线程的最后下载位置。

● 将DownloadProgressListener接口以对象的形式当做参数传入download方法中。(3)在FileDownloader类中的download方法中“new”DownloadThread类实现断点多线程下载,并存储在指定的文件中。DownloadThread线程返回文件是否下载完成。(4)在FileDownloader类中的download方法中完成未下载完的补救方案。(5)如果已经下载完成,则删除数据库中的文件,并通过DownloadProgressListener接口中的onDownloadSize方法得到已经下载文件的数量。(6)将下载文件的大小和已经下载的数量已经返回给新开启的线程中,通过Handle异步通信实现页面重绘。将文件的下载进度显示在UI界面上。

完成此功能需要解决的技术要点:

● 完成页面UI和布局文件;

● 数据库中记录各线程已经下载的信息,对各个线程的下载记录进行操作;

● 构造下载器;

● 实现下载功能,并同时可以得到实时的各个线程的下载数量;

● 完成下载的进度的实时更新;

● 得到下载文件的名字;

● 完成页面的实时更新。

因为多线程文件下载涉及Web服务端和Android客户端,所以需要分别建立这两部分工程。

2.Android多线程断点续传下载之服务器端

服务端的核心功能是提供一个相对比较大的文件以供Android客户端下载使用,具体建立过程如下所示。(1)建立一个动态的Web工程“ServerForMultipleThreadDownloader”,如下图所示。

一切采用默认设置,单击“Finish”按钮完成工程的创建。此时的工程视图如下图所示。(2)把一个相对比较大的音频文件加入到WebContent的根目录下,例如,笔者这里加入的是笔者自己的CNN录音文件,文件名为“CNNRecordingFromWangjialin.mp3”,加入后的工程视图如下图所示。(3)发布服务端Web工程,如下图所示。

发布后的Eclipse内置的浏览器显示如下图所示。

此时在该浏览器中输入http://localhost:8080/ServerForMultipleThreadDownloader/CNNReco-rdingFromWangjialin.mp3,出现如下图所示的页面。

因为安装了浏览器的播放器的缘故,此时笔者的计算机上正在播放自己模仿的CNN新闻播音。

至此,Web服务器端实现并发布成功。

3.Android多线程断点续传下载之Android客户端(1)新建Android工程,工程的名字为“MultipleThreadContinuableDownloaderForAndroid4”,如下图所示。

单击“Next”按钮,选择默认的Android 4.0平台,如下图所示。

单击“Next”按钮,把包名设为“com.wangjialin.internet.multipleThreadContinuableDown-loaderForAndroid4”,单击“Finish”按钮完成。此时的工程视图如下图所示。(2)完成主界面main.xml,其具体内容如下所示。

在main.xml中我们用到了水平进度条ProgressBar,这是Android所定义的,我们如果要访问Android系统中定义的样式,就必须加一个“?”,也就是说要引用Android系统中的样式。

style="?android:attr/progressBarStyleHorizontal"这里面的样式和以前接触过的 css 样式很相似,主要定义页面显示的一个风格。我们在下载的过程中,还用到了百分率,我们用 textview来表示,用到了Andorid的居中显示android:gravity="center",内容可以居中对齐。

此时打开main.xml的Graphical Layout视图,如下图所示。

从上图中可以看到,需要定义path、button、stopbutton等几个字符串资源,具体的strings.xml内容如下所示。

此时再看main.xml的Graphical Layout视图就不会有显示问题了,如下图所示。(3)完成数据库的设计、实现以及对数据库的操作。

数据库中表的字段有id,downpath,threadid,downlength。

● id:代表数据记录的主键。

● threadid:代表线程的id。

● downlength:代表线程下载的最后位置。

● downpath:代表当前线程下载的资源,因为一个下载器可能会同时下载很多资源。

此时建立自己的数据库管理类,负责数据库和数据表的创建、升级、初始化等工作。

创建数据库管理类DBOpenHelper,该类需要继承“android.database.sqlite.SQLiteOpen Helper”,如下图所示。

DBOpenHelper的具体内容如下所示。

接下来建立数据库业务操作类,如下图所示。

单击“Finish”按钮完成创建,FileService的具体内容如下所

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载