Android性能优化技术在某体重管理APP中的应用研究

Android性能优化技术在某体重管理APP中的应用研究
饶 炜
(东南大学 蒙纳士大学苏州联合研究生院,江苏 南京 211189)
摘 要:目前Android是市场占有率第一的手机操作系统,其应用越来越丰富,想要在众多应用中脱颖而出,应用的质量尤其重要。在Android应用开发过程中,可优化的方面有CPU、内存等,于此对应的有很多性能优化的方法可供选择。笔者结合一款实际的Android APP,介绍一些在开发过程中遇到的性能问题,然后探讨了这些问题的解决方案。电腐蚀机
关键词:Android;性能优化;内存;ANR;OOM
中图分类号:TP311.52  文献标识码:A  文章编号:1003-9767(2017)02-032-04
果壳箱Research on Application of Android Performance Optimization Technology in
<a Weight Management
Rao Wei
(Southeast University-Monash University Joint Graduate School(Suzhou), Nanjing Jiangsu 211189, China) Abstract: At present, Android is the mobile phone operating system that has first market share. Its application is also increasingly rich. The application of the quality is particularly important if it wants to stand out in many applications,. In the Android application development process, the CPU, memory and etc. can be optimized. And there are many performance optimization methods can be chosen. Combined with a practical Android APP, the author describes some of the performance problems encountered in the development process, and then explores the solution to these problems.
Key words: Android; performance optimization; memory; ANR; OOM
1 概述
Android操作系统是Google推出的一个基于Linux内核的开源手机操作平台,使用自己发布的开源组件,与其他手机操作系统如微软的Windows Phone、苹果的IOS、黑莓的BlackBerry OS对比,Android操作系统因为其开源性受到广大手机厂商的青睐。作为一款手机操作系统,其优点是界面友好、操作便捷、软件功能丰富、学习成本低,加上拥有众多厂商的多种多样的产品可供用户选择,所以自其推出后其市场占有率越来越大,与此同时,对软件质量的要求也越来越高。
虽然目前手机硬件在不断改进,但CPU和内存依然是非常宝贵的资源,性能优化问题一直是重点又是难点。在软件开发过程中,错误的代码或者不良的开发习惯会造成硬件资源的浪费,可能出现的问题包括操作延迟、界面卡顿,甚至造成应用强制退出。当问题比较严重时可能会产生ANR(Application Not Responding)或者OOM(Out Of Memory)。造成ANR的原因是BroadcastReceiver 10秒内没有结束或者UI线程5秒内不能处理用户事件,具体是因为在执行UI线程时有大量的数据操作、复杂的数据计算、长时间的网络数据请求等造成了阻塞,导致UI线程无法按时执行结束,导致应用无法响应。OOM则是因为Android 设备内存空间不足而导致,其原因则可能是过多使用String 变量、没有及时释放不使用的强引用对象、用于处理图像的Bitmap没有释放等,这些因素都会导致操作系统选择性地杀掉一些进程来释放内存。
本文结合一个具体的Android APP开发讨论一些性能优化技术,该体重管理软件是一款孕期体重管理的APP。其功能包括登录注册、记录体重、查看历史数据、增重曲线、增重提醒、健康资讯与收藏管理等。该APP的简要使用流程如图1所示。
2 利用多线程技术进行优化
2.1 解决UI卡顿问题和ANR错误
在进入应用主界面时,如果当前是联网状态,因为可能
作者简介:饶炜(1992-),男,安徽安庆人,硕士研究生。研究方向:移动开发。
该APP在别的手机上使用过造成数据不一致,所以应用会连接远程服务器获取最新体重数据进行数据同步操作,如果将联网获取数据操作放在主线程(UI线程)中可能会造成ANR错误,所以这里要用到多线程技术。对于一些可以后台进行的操作,如下载文件、网上获取大量数据、批量数据库操作,为了最大限度利用CPU,可以使用多线程技术让这些耗时的操作异步处理[1],避免让前台界面等待这些操作完成后再回应用户点击事件。
Android开发过程中一般有两种方法解决这个问题。2.1.1 AsyncTask
AsyncTask是一个轻量级的异步类,在使用AsyncTask 时处理类需要继承AsyncTask,这里需要三个泛型参数,分别是Param、Progress、Result,分别对应的是任务执行、后台计算、后台计算结果返回这三个步骤所需要的数据类型,这个类还需要至少重载AsyncTask的四个方法中的一个。四个方法详细介绍如表1所示。
表1 AsyncTask的四个方法
方法名方法说明
onPreExecute预处理操作,为后台的任务做准备操作doInBackground此方法必须重载,需要异步执
行的操作在此方法中实现onProgressUpdate如果在doInBackground方法中有publishProgress,则触发此方法onPostExecute用于处理后台任务执行的结果
通过上面四个方法,即可实现后台处理一些费时的操作而不影响前台UI进程的执行。
2.1.2 Handler
当使用Handler实现异步时,要涉及四个对象:Handler、Thread、Message、Looper。其实现异步的方式是:主线程启动子线程Thread,在运行时会收到包含数据的Message对象,会进入一个单链表数据结构的消息队列MessageQueue,再由Looper进行轮询消息,将其传递给Handler,Handler获取Message后则进行程序设定的操作,比如更新主线程中的UI。
2.1.3 两者比较
Handler优点是结构清晰,当有多个后台任务时比AsyncTask更简单清晰,而当只是单个的后台异步操作,则比AsyncTask需要更多代码,结构相对复杂一些。在本文体重管理APP的开发过程中,使用的是Handler,因为在一些情景如编辑收藏列表时,涉及UI更新、数据库操作、网络数据传输多个后台异步操作。
2.2 加速网络数据传输
更新APP时,普通下载速度比较缓慢而且出现网络异常则要重新下载,所以可以使用多线程下载来提升下载速度,并通过HTTP协议实现断点续传[2],步骤如下。
(1)首先获得下载文件的长度,然后设置本地文件的长度。在Android客户端创建一个空文件,大小和服务器文件相同。
RandomAccessFile file = new RandomAccessFile("WeightApp. apk","rwd");//创建空白文件
file.setLength(filesize);//设置本地文件的长度
(2)根据开启的线程数量和待下载的文件长度计算每
条线程下载的数据长度和下载位置。图1 体重管理APP使用流程图
int blocksize = length / threadcount;
(3)使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止。
(4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。
RandomAccessFile threadfile = new RandomAccessFile ("W eightApp.apk ","rwd");
喷气式飞行器threadfile.seek(XXX);//从文件的什么位置开始写入数据3 内存优化
3.1 Android内存管理机制
目前Android应用开发都是基于Android中的Dalvik虚拟机,其也具有垃圾回收机制。在实际运行过程中,Android 系统会给每一个应用程序启动一个独立的虚拟机,分配的内存大小默认为16M(根据不同手机厂商可能大小不同),这样做的好处在于每个程序之间相互独立,避免一个崩溃影响到另一个应用程序,但是这么做也会造成当启动多个应用程序时,会有更多的内存消耗。另一方面,在Android操作系统中,进程并不是停止活动后就立即结束,而是暂时保留在内存中,直到系统将内存分配完毕需要更多的内存时才会选择性地中止某些进程[3],具体判断结束进程的方法如下。
(1)系统对所有进程进行重要性评级并用“oom_adj”这个数值来表示,其值越大,代表被系统选择终止的可能性越大。
(2)前台进程(Active Process)和已启动服务的进程(Started Service Process)的“oom_adj”值为0,所以不会被中止,一旦其不能被访问,就会根据进程在LRU表中的位置决定给其更高的“oom_adj”值。
(3)Android可以通过编写进程管理脚本来定制其进程管理模块,可以根据“oom_adj”值范围来进行进程管理。
这样的内存管理策略好处是某些情境下用户切换APP后再返回时因为进程仍然在内存中,提升了进程的启动速度,有利于提升用户体验,但同时这样也可能会因为回收不及时而造成内存不足。
3.2 几种优化方法
3.2.1 Bitmap的加载优化
本应用中的健康资讯功能模块会推送一些新闻资讯给用户,其中会插入图片,对图片处理不当也可能会造成OOM错误,这对应的就是Bitmap的加载优化问题[4]。如果将原始图片数据直接存入内存,因为Android操作系统分配给每个应用的内存有限,很可能出现内存不足导致应用强制退出。实际优化操
作是根据设备分辨率使用BitmapFactory. Options这个类来缩放图片,通过设置参数来控制加载图片的大小,减少内存分配。在使用完Bitmap对象后,需要调用le()方法将Bitmap对象销毁,便于垃圾回收机制及时将其回收。
3.2.2 根据对象生命周期引用Context
在使用Context实例化对象时,如果对象生命周期与Activity一致,则可以直接使用XXXActivity.this作为参数。但是,当对象的生命周期长于Activity的生命周期,这么做会使Activity在原本能够回收时因为对象应用了其Context而无法回收造成内存泄漏[5],这时需要引用的是ApplicationContext,即应用的上下文,它的生命周期和对象一致。
3.2.3 对象引用的优化
对象的引用可以分为四个级别,即强引用、软引用、弱引用、虚引用,其强度依次减弱。如表2所示。
表2 对象引用的四种方式
引用名对象何时被回收说明强引用(StrongReference)只有在对象引用为空时才能被回收
软引用(SoftReference)系统内存不足时回收
弱引用(WeakReference)被垃圾回收器扫描到后回收
去污水虚引用(PhantomReference)任何时候都可能被回收
在Android应用开发过程中,可以将一些占用内存大、生命周期长的对象使用软引用或者弱引用,减免过多使用强引用而造成OOM错误。比如有不常用的图片和Cache使用软引用保存,保证当系统内存不足时垃圾回收器能够及时回收一些内存,增强系统稳定性。
3.2.4 及时关闭数据库游标Cursor
该体重管理APP需要用到SQLite数据库存储用户体重数据,这里涉及增删查改操作,在进行查询和更新操作后数据库会返回一个Cursor,在使用完毕后应及时关闭防止内存得不到释放而不能被垃圾回收器回收。
动态沙盘
4 其他方面的优化
4.1 页面布局优化
首页因为使用了较多的控件,涉及页面布局优化问题,这里主要比较两个最常用的布局:RelativeLayout和LinearLayout。在Android中,View需要经过measure()、layout()和draw()三个过程
才能绘制出来。RelativeLayout布局方式需要对所有子view进行两次测量,而LinearLayout 则是在有weight属性时才会进行两次测量,否则是一次。一个页面布局实现往往包含很多控件,如果它们之间都是平级关系则LinearLayout性能会更好一些,但实际开发过程中使用LinearLayout会比RelativeLayout更易产生多层嵌套结构[6],而RelativeLayout布局方式比较灵活,所以其层级结构往往更加扁平,对应的性能会更好一些。
4.2 Listview优化
在该体重管理APP中,体重历史数据表、知识百科的标题列表、收藏表等这些表的实现都要使用到Listview控件。
Listview控件是Android开发过程中使用率最高的控件之一,其作用是以列表的形式展示内容,当数据量比较大时,如果对其处理不当,很可能造成卡顿现象,甚至直接报ANR错误。Listview控件显示数据需要适配器Adapter、XML布局文件、数据和Listview控件这四个元素[7],其工作流程可以简述为Adapter将数据以XML布局文件要求的方式显示在Listview 控件中,对于Listview性能优化的重点在于对Adapter的优化。
Android提供了多种Adapter,BaseAdapter是最基础的一种Adapter,其工作时需要重载一个getView()方法来刷新列表显示。如果不对其进行优化,会产生两个问题:(1)每次列表显示一项内容,都需
要重新加载布局文件,如果数据内容较大如包含图片则会占用较大内存;(2)如果列表包含多个控件,则需要使用findViewById方法在布局文件中去对应的ID,这种多次重复的查操作也是可以通过优化避免的。
第一个问题,因为Listview控件每次显示并不能显示所有数据,而是只能显示屏幕大小所能容纳的数据条数,而且getView方法提供了一个convertView参数,所以利用复用方式使用因滑动屏幕而消失的条目对应的布局文件,省略再次加载布局文件的步骤[8]。第二个问题的解决办法是定义一个内部静态类Viewholder,其成员变量与布局文件中各组件类型相同,并创建相应数目的holder对象,将所有控件与holder绑定,再使用setTag和getTag这两个方法查标签,提高效率。
另外,在健康资讯功能模块中,使用到了一个技巧,即加载新闻资讯信息时不一次性全加载完毕,而是每次加载15条资讯,当用户滑动界面列表到底部时,再加载15条,这样做可以避免加载过多产生OOM,并减少用户等待网络数据传输的时间。
4.3 网络数据传输优化
该体重管理APP在联网状态下打开会进行数据同步操作,若用户未连接无线网,就涉及用户在使用系统过程中所产生的费用,为了节省用户费用,进行数据同步操作时有一个筛选操作,已同步过而且未修改的数据就不需要再次同步。传得多就传得慢,如果没做过特别优化,传输Payload 可能会比实际
所需要的大很多,那么对于整体网络服务耗时影响非常大。更有效地减少数据传输量的方法是优化TCP服务Payload数据的格式和序列化/反序列化算法,比如使用Protocol Buffer数据格式,如果使用JSON数据格式,可以选用一个高效的反序列化算法,对于图片格式优化在业界已有成熟的方案,例如Google开发的WebP图片格式[9],已被国内外众多APP使用。
5 结 语
本文对一款Android APP的开发过程中遇到的一些问题进行了一些Android性能优化方面问题的探讨,并对一些问题给出了具体的解决方案。但由于个人能力和研究时间有限,还有一些方面的优化没有研究,另外,有些性能优化问题可以进一步深入研究。主要有以下几个方面:
(1)Android提供了功能丰富的性能分析工具,下一步可以借助这些工具进一步优化;(2)内存优化是众多优化中最重要的一个方面,还有更多的细节和解决方案值得探讨;(3)电量是目前移动设备最宝贵的资源之一,应用电量消耗方面的优化有很多工作要做。
参考文献
[1]杨杰.基于Android的多线程处理技术[J].电脑知识与技术:学术交流,2013(18):4251-4254.
[2]闫伟,叶建栲.多线程技术在android手机开发中的应用[J].信息通信,2012(1):46-47.
[3]魏栋,谭功全,叶建平.Android系统的内存管理研究[J].单片机与嵌入式系统应用,2012,12(4):9-12.
[4]Cao B Q, Hao X U. The optimization of methods that Bitmap occupies the memories to avoid OOM in Android[J]. Journal of Henan Institute of Engineering, 2014.
[5]段琳.深入剖析Android Activity[J].中国新技术新产品,2011(16):33-34.
[6]Jackson W. Android’s RelativeLayout Class: UI Design Using One Layout Container[M]// Pro Android UI. Apress, 2014:387-409.
[7]Jiang F, Ku S. How to Display the Data from Database by ListView on Android[C]// International Workshop on Intelligent Systems and Applications. IEEE, 2010:1-4.
[8]孔令宏.Android中的listview控件的优化方法[J].电子技术与软件工程,2013(21):270.
[9]Calore M. Meet WebP, Google’s New Image Format[J]. 2010.

本文发布于:2024-09-23 04:34:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/277356.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:使用   数据   优化   操作
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议