APP下载

Android异步技术的对比实验及应用

2016-03-17杨春花

计算机应用与软件 2016年2期
关键词:线程内存稳定性

陈 星 杨春花

(齐鲁工业大学信息学院 山东 济南 250000)



Android异步技术的对比实验及应用

陈星杨春花

(齐鲁工业大学信息学院山东 济南 250000)

摘要异步技术的选用是制约Android应用产品优劣的重要因素之一。目前Android应用开发的重要异步技术主要包括AsyncTask、ThreadPool、Thread+Handler这三种。针对这三种异步技术在面对短时间内高爆发的场景时的表现,设计了一个Android应用,分别在稳定性、响应速度、资源耗费等指标方面进行了对比实验及综合分析。实验结果表明,在这三种异步技术中,ThreadPool技术的综合表现最优秀。该技术能更好地适应于短时间内与网络进行大量数据交互的情形,并在一个移动OA项目中采用了ThreadPool技术,利用此技术实现了异步下载文件的功能。

关键词Android异步AsyncTaskThreadPoolThreadHandler

CONTRAST EXPERIMENT OF ANDROID ASYNCHRONOUS TECHNOLOGIES AND THEIR APPLICATION

Chen XingYang Chunhua

(School of Information,Qilu University,Jinan 250000,Shandong,China)

AbstractThe selection of asynchronous techniques is an important factor restricting the pros and cons of Android applications. At present, the important asynchronous techniques of Android application development include AsyncTask, ThreadPool and Thread+Handler. Aiming at the performance of these three asynchronous techniques when facing the scene of high outbreak in short period, we designed an Android application, and carried out the contrast experiments and analyses on stability, reaction speed and consumption of resource separately. Experimental result showed that the ThreadPool technique had the best comprehensive performance among three asynchronous techniques. This technique could better adapt to the situation of interacting a large amount of data with network in a short period. In a mobile OA project the ThreadPool technique was adopted, and by using it the function of asynchronous files download was realised.

KeywordsAndroidAsynchronousAsyncTaskThreadPoolThreadHandler

0引言

Android系统从投入使用到现在对智能手机行业产生了巨大的影响。据2010年末数据显示,正式推出仅两年的Android操作系统在市场占有率上已经超越称霸逾十年的诺基亚Symbian系统,成为全球最受欢迎的智能手机操作系统[1]。随着通信技术的不断发展,网络技术的不断改良,实时通信网络效率成为了越来越多的智能手机使用者所关注的事情。

Android系统的一个重要缺陷在于它的响应能力不足,它对用户的应用有直接消极的影响[2]。为了解决低响应问题和保持图形用户界面(GUI)的活跃性,一个APP应用往往包含一个主UI线程来更新视图和若干个子线程在后台异步运行来处理耗时操作,例如网络请求、I/O任务等[3]。异步技术是当前解决低响应问题的重要手段。

当前,许多研究针对采用异步技术来解决Android应用的低响应问题提出了一些解决方案,如文献[4]针对改善手机Web Servers的并发控制,提出了基于异步方法的DRMS;文献[5]为了减省手机内存,提高加载资源速度的异步加载机制等。但是,对于各种异步技术本身之间的对比研究却很少有文献提及。由于不同的异步技术具有不同的特点,适应的场合也会不同。对它们进行比较研究可对Android应用开发实践中异步技术的选择提供一定的参考。

本文通过一个Android应用实例,对Android开发实践中常用的三种异步技术-AsyncTask异步线程技术[6]、ThreadPool技术[7]、 Thread+Handler技术[8,9]进行了对比实验,从稳定性、响应速度、资源耗费等方面对比了各自的优劣。通过对比实验对这三种异步技术所适应的场所进行了总结,得出最终结论,并在一个移动OA项目中采用了ThreadPool技术,实现了异步下载文件的功能。

1相关异步技术简介

1.1AsyncTask异步线程技术

Android为了降低开发难度,提供了AsyncTask异步线程技术,它能在不必操作Thread和Handler的情况下在后台进行耗时操作并把结果返回到UI主线程中,让使用者非常方便地进行异步处理,但这种技术适用于短时间操作。AsyncTask是一个封装过的后台任务抽象类,其本质是一个静态线程池,它派生出的子类可以实现不同的异步任务,这些任务都被提交到静态线程池中执行,但从Android 3.0开始后,为了避免并行执行引起的应用错误,任务则被提交到一个线程上按先后顺序执行[6]。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法:onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…)和onPostExecute(Result)[10]。onPreExecute()在任务开始之前调用,为后台线程运行做准备工作,当它执行完毕后运行doInBackground(Params…)方法;在doInBackground(Params…)方法中做比较耗时的操作,因为它是运行在后台线程中的所以不能直接操作UI,而任务的处理往往需要一段时间,为了方便使用者及时获知任务处理的进度,可以调用publicProgress(Progress…)来更新任务处理进度并在onProgressUpdate(Progress…)中反馈给用户任务执行的进度条;onPostExecute(Result)在主UI线程中执行,相当于Handler 处理UI的方式,在此方法里可以使用从doInBackground (Params…)中获得的结果并操作UI。

1.2ThreadPool技术

在面向对象编程中,线程的创建、运行和销毁不仅占用了部分内存资源而且消耗了一些时间,所以为了让应用更加高效,引入了“池资源化”的思想,而线程池也是和这一思想相符合的。

线程池是一种多线程处理形式。因为线程的生命周期随着线程的停止而结束,为了能让线程循环重用而不是每当完成一项任务后就停止,应先在应用程序启动或者运行过程中创建一定数量的线程并让它们进入阻塞状态等待,还应把所需完成的任务放在队列或者其他数据结构中[11]。当有任务到达时,不应该为每个任务都创建一个新的子线程来服务它,而应从已经存在的线程池中选一个空闲线程来完成任务,等任务完成结束后,子线程再回到空闲池中[12]。

线程池的使用不仅节省了处理时间与内存资源,而且它的一个特点在于线程池中的线程是由系统管理的,不需要人为管理,更加方便了使用者的开发。线程池技术的应用范围比较广泛,特别适用于有大量并发访问,但任务短小的应用中[13]。

1.3Thread + Handler技术

一个线程就是一个轻量级的过程,每一个线程都有自己的内存缓存,把读取的共享文件储存在自己的内存缓存中[14],它也是一个并发执行的单位,而每个应用程序在启动时至少有一个线程在运行,称为主线程[8]。Android应用的主线程是UI线程,是不安全的线程,也就是说UI控件的更新只能在主线程中完成,子线程不允许操作UI,所以Android为了实现线程间的通信,开发了Handler、 Message、MessageQueue、Looper机制。

在Android系统中,子线程不能直接更新主线程的UI控件,须使用Handler和Looper将子线程中的数据传递给主线程,由主线程来刷新UI控件,Looper提供了一种消息循环机制,负责循环获取由Handler存放于MessageQueue中的数据[15]。使用多线程的目的是为了更充分地利用资源,但资源总数是有限的,需要在线程数量与程序性能之间确定一个平衡,线程过多会严重影响程序本身的性能,线程过少软件和硬件性能得不到充分发挥[16]。

2实验测试和比较

为了对比三种异步技术的优劣,本文设计了一个简单的Android应用实例-图片下载,分别利用上述三种异步技术进行实现。同时,针对需要对比的稳定性、响应速度、资源耗费等指标增加了相应的代码进行衡量。测试环境由一台计算机和一部手机组成,计算机充当服务器,手机充当客户端,两者由100 Mbit的网络连接。计算机的操作系统选用WIN 7,使用Google的PLAY框架构成服务器环境,系统中承载实验所需软件的所有需求,手机的操作系统为Android 4.4,测试所用的软件为Ecplise。

2.1测试方法与指标

把本文设计的应用安装到手机上,通过手机WIFI连接电脑,并访问本机服务器。此应用分别利用AsyncTask、ThreadPool、Thread+Handler这三种技术来实现相同的功能,亦即下载本机服务器上的图片并加载显示到手机上。

实验主要比较各自技术的稳定性、响应速度、资源耗费等指标。其中稳定性的衡量选用短时间内成功下载的图片个数与图片总数的比值来体现;响应速度的衡量主要通过下载时间、下载并发性来体现;资源耗费的衡量选用内存消耗来体现。

实验分别针对图片的下载数量做了100、200、300张这三次变化, 用于模拟短时间高爆发请求的实验环境,记录使用各自技术所需的下载完成情况、下载并发性、下载完成时间、内存消耗情况这四种实验数据,分别用于体现相应指标。由于实验测试所用的网络环境及应用所消耗的手机资源等因素不能保证每次测试得到的结果都准确一致,为了确保实验的准确性,本文进行了三次测试,并记录了每一次的测试结果,最后取三次的平均值作为最终实验结果。

2.2测试结果及分析

2.2.1稳定性

图1 不同图片总数的下载率

在本实验中,稳定性选用下载率来体现,而下载率为短时间内已下载的图片个数与所有图片总数的比值,这个比值越接近1越好,比值为1说明短时间内下载的图片已全部下载完成。不同图片总数的下载率如图1所示。

实验结果表明,当下载图片个数从100张递增到300张时,利用AsyncTask技术和ThreadPool技术的下载率都为1,说明这两种技术都能稳定的完成下载任务;而利用Thread+Handler技术,在下载100张图片时能稳定完成下载任务,但随着下载图片总数的增加,它的下载性越低,即它稳定完成任务的成功率越低。

从实验结果得出结论,利用ThreadPool技术与AsyncTask技术加载大量数据时所体现的稳定性一样,且都很稳定可靠,而利用Thread+Handler技术加载大量数据时的稳定性较一般,特别是当下载数量较大时这种表现更为明显。

针对这一结论,分析其造成的可能原因是因为AsyncTask技术与ThreadPool技术归根结底都是线程池,而线程池一个的独特优点在于线程都是由系统统一管理的。各线程之间互不影响,这就避免了像Thread+Handler技术中会为每个任务创建一个新线程,各线程之间相互挤占系统资源所出现个别线程卡住,造成任务完成失败的情况。因此AsyncTask技术和ThreadPool技术的稳定性都是一样稳定可靠的,而Thread+Handler技术的稳定性较一般,在任务量变得越来越大时体现的更加明显。

2.2.2响应速度

在本实验中,响应速度选用下载完成时间,下载并发性来体现。三种技术的下载图片个数及所用时间的折线如图2所示。

图2 不同图片总数的所需下载时间

实验结果表明,不同图片总数的所需下载时间如图2所示。利用ThreadPool技术加载大量数据时所需时间最短,利用Thread+Handler技术的次之,利用 AsyncTask技术的时间最长。从下载并发性说明,利用Thread+Handler技术和ThreadPool技术一样都是并发执行的,而利用AsyncTask技术加载时则出现了顺序性。

从实验结果得出结论,ThreadPool技术的反应能力最强,Thread+Handler技术次之,AsyncTask技术最弱。针对这一结论,分析造成的可能原因是因为ThreadPool技术在任务到达时就已经创建好了一定量的线程并储存在“池”中,只需从“池”中拿出空闲的线程来执行任务即可,因此省去了创建、切换线程的时间,所以ThreadPool技术比Thread+Handler技术省时。在Android 3.0之后,Android对AsyncTask技术做了修改,让它execute()提交的任务按照先后顺序每次只运行一个,则用它加载时就出现了顺序性,而ThreadPool技术与Thread+Handler技术都是并发执行的,所以AsyncTask技术最为耗时。

2.2.3资源耗费

在本实验中,资源耗费选用各技术的内存资源消耗情况来体现。三种技术的下载图片的内存消耗情况如图3所示。

图3 不同图片总数的内存耗费

实验结果表明,利用ThreadPool技术下载图片时所消耗的内存最少,利用AsyncTask技术的次之,而利用Thread+Handler技术的内存消耗最大。

从实验结果得出结论,ThreadPool技术的耗费能力最好,即消耗内存最少,AsyncTask技术次之,Thread+Handler技术最差。针对这一结论,分析造成的可能原因是因为ThreadPool技术能限制应用程序在同一时刻运行的线程数。一般每当开启运行一个新线程时都会占用一部分内存资源,而ThreadPool技术是在任务到达前就创建好了固定的线程数。用这些线程来并发执行任务,所以省去了为每个任务创建、切换线程的内存消耗,所以它的耗费能力最好,在这三种异步技术中消耗内存最少。

2.3测试总结

通过以上测试指标,能得知各自的技术的特点及面对不同环境时体现出的优劣,最后对这三种技术所较为适应的环境做出总结。当短时间内进行大量数据交换时, ThreadPool技术更有优势;而当用户遇到在保证任务完成稳定性的同时但对耗费时间要求较宽松的情景下,可以选择AsyncTask技术;当用户遇到需要完成的任务量较少,对任务完成稳定性要求较宽松但对耗费时间要求比较严格的情境下,可以选择Thread+Handler技术。

3异步技术的应用

通过对比实验得知,ThreadPool技术在面对短时间内进行大量数据交换的情景时更有优势,并在一个移动OA项目中采用了ThreadPool技术,实现了用户能在短时间内下载附件内容的功能。

移动OA项目主要包括八大模块:登录模块、请假申请模块、请假审批模块、公文审批模块、通讯录模块、通知公告模块、值班信息、值班管理。其中在公文审批模块中,有的审批内容包含了所对应的公文附件,而公文附件主要是一些图片和Word、Excel文件等,这就需要用户下载下来进行审阅。为了方便用户能在最短的时间内完成下载,所以不同的下载任务需满足并发执行,且要避免因并发执行时因相互挤占系统资源所出现死锁的现象,而ThreadPool技术能有效的解决上述问题,最终采用ThreadPool技术实现了下载附件内容的功能。

3.1关键技术的实现

利用ThreadPool技术实现下载公文附件内容的结构流程如图4所示。

图4 线程池下载流程图

如图所示,因为Android系统会为每个程序运行时仅创建一个Application类的对象,故在程序的Application中利用Executors.newFixedThreadPool()创建线程池对象。当线程池开启时,创建一个独立的轮询子线程,此轮询子线程的作用是不断的检查工作队列,如果队列中有未执行的任务,就将任务交给线程池来执行。下面的代码部分实现了线程池及轮询子线程的创建:

/** 线程池 */

private ExecutorService threadPool;

/** 工作队列 */

private LinkedList asyncTasks;

// 创建线程池

public ThreadPoolManager (int poolSize) {

this.poolSize = poolSize;

threadPool= Executors.newFixedThreadPool(this.poolSize);

asyncTasks = new LinkedList();

}

// 轮询子线程的创建

private class PoolRunnable implements Runnable {

@Override

public void run() {

try {

while(!Thread.currentThread().isInterrupted()) {

ThreadPoolTask task = getAsyncTask();

if (task == null) {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

continue;

}

threadPool.execute(task);

}

} catch (Exception e) {

} finally {

threadPool.shutdown();

}

}

}

工作队列是一个存放下载任务单元的LinkedList,每次添加新的任务时利用LinkedList.addLast()从尾部进行添加,取出任务时利用LinkedList.removeFirst()从头部取出,即实现了队列的先进先出原则。工作队列中存放的是一个个不同的下载任务,而这些下载任务实际上是实现Runnable接口的子线程,每个子线程中都承载了不同的下载目标,在各自的run()中实现不同的功能,其结构如下:

public abstract class ThreadPoolTask implements Runnable{

//网络连接的url

private String mUrl;

//参数

List mParamList = new ArrayList();

//Handler

private Handler mHandler;

//HttpClient

private HttpClient mhClient = null;

/**

* 构造函数

*/

public ThreadPoolTask(String url, List paramList, Handler handler, HttpClient httpClient) {

this.mUrl = url;

this.mParamList = paramList;

this.mHandler = handler;

this.mhClient = httpClient;

}

public abstract void run();

...

}

3.2实现结果

将项目打包安装到真机上,其下载附件的实际效果如图5所示。

图5 下载效果图

4结语

本文先通过一个下载图片的Android应用,对AsyncTask、ThreadPool和Thread+Handler三种异步技术进行了对比实验。实验结果表明,AsyncTask技术的稳定能力不错,但它运行时出现了顺序性,所以在短时间内下载大量数据时,比较耗时;Thread+Handler技术的运行是并发执行的,但稳定性较为一般,而且内存消耗较大,特别是当任务量较大时体现的更加明显;ThreadPool技术,它的稳定能力不错,反应能力跟耗费能力都是最好的。因此,在短时间内进行大量数据交换时,选用ThreadPool技术更有优势。

然后根据得出的结论选用了ThreadPool技术并将其应用在一个移动OA项目中,实现了异步下载文件的功能,并对线程池应用的关键技术做了较详细的说明。下一步的工作是进一步优化下载模块的性能,由于在创建线程池的同时就规定了线程池的大小,而线程数过多或过少都会对产品的性能产生一定的影响,所以选用一个合适的大小显得尤为重要。

参考文献

[1] 刘亚丽.Android软件前景浅析[J].科技创新导报,2011(25):32.

[2] Shengqian Yang,Dacong Yan,Rountev A.Testing for poor responsiveness in Android applications[C]//Engineering of Mobile-Enabled Systems (MOBS).San Francisco,CA,USA:IEEE,2013:1-6.

[3] Sai Zhang,Hao Lü,Michael D Ernst.Finding errors in multithreaded GUI applications[C]//Proceedings of the 2012 International Symposium on Software Testing and Analysis.New York,NY,USA:ACM,2012:243-253.

[4] Mishra S,Sarasvati S,Srivastava S,et al.An Asynchronous Based Approach to Improve Concurrency Control in Mobile Web Servers[C]//Proceedings of the 8th International Collaborative Computing.Pottsburgh,PA:IEEE,2012:355-362.

[5] Gejian Ding,Xue Liu,Huajiang Zhang,et al.Research of an Optimized Asynchronous Loading Mechanism[J].Applied Mechanics and Materials,2013(278-280):1809-1813.

[6] Android Developers website.AsyncTask[EB/OL].[2014-3-18].http://developer.Android.com/refreence/Android/os/AsyncTask.html.

[7] 封玮,周世平.Java中的线程池及实现[J].计算机系统应用,2004(8):16-18.

[8] Android Developers website.Thread[EB/OL].[2014-3-18].http://developer.Android.com/reference/java/lang/Thread.html.

[9] Android Developers website.Handler[EB/OL].[2014-3-18].http://developer.Android.com/reference/Android/os/Handler.html.

[10] 周兵.Android中UI线程与后台线程交互的探讨[J].郧阳师范高等专科学校学报,2013,33(3):14-16.

[11] 邵孟良.Java线程池技术在多媒体网络教室中的应用与实现[J].科技与生活,2011(15):188.

[12] 刘海燕,吕延岗,张红瑞.基于线程池技术DHCP服务器的设计与实现[J].计算机技术与发展,2006,16(7):76-78.

[13] 王华,马亮,顾明.线程池技术研究与应用[J].计算机应用研究,2005,22(11):141-142.

[14] Kai Ni.A Data Delivery Controller for Mobile Communication Based on Multiple Threads Mechanism[J].Applied Mechanics and Materials,2013(433-435):1613-1617.

[15] 王秀敏,张麒,李婷婷.Android平台下多路倾角传感器驱动的设计与实现[J].仪表技术与传感器,2013(9):18-20.

[16] 眭俊华,刘慧娜,王建鑫,等.多核多线程技术综述[J].计算机应用,2013,33(A01):239-242.

中图分类号TP311.52

文献标识码A

DOI:10.3969/j.issn.1000-386x.2016.02.045

收稿日期:2014-07-28。山东省自然科学基金项目(ZR2011FQ0 17)。陈星,硕士生,主研领域:移动应用开发。杨春花,教授。

猜你喜欢

线程内存稳定性
一类k-Hessian方程解的存在性和渐近稳定性
SBR改性沥青的稳定性评价
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
“春夏秋冬”的内存
浅谈linux多线程协作
半动力系统中闭集的稳定性和极限集映射的连续性
内存搭配DDR4、DDR3L还是DDR3?
基于内存的地理信息访问技术
一类离散非线性切换系统的稳定性