20年历史・500强案例

专业APP小程序/网站开发

免费获取设计方案
App性能优化浅谈

前言

前段时间予远信息科技(上海)有限公司的小伙伴们进行了关于app性能优化的技术分享,这里我稍微整理一下也给大家分享一下,关于性能优化这个话题很大,涉及面可以很广,也可以很深入,本人能力有限,不会给大家讲特别难懂,特别底层的东西,都是我们开发能着手去做的点,大家都在讲性能优化,但对于项目经验不够丰富的朋友很难有一个概念,做优化的时候也会比较茫然,这里我就给大家指明方向。

从何讲起?

在做产品开发的时候,也遇到性能瓶颈,测试工程师反馈了一些比较明显的问题,比如UI界面的过度绘制,列表滑动有明显卡顿,比较耗内存等等,但以往的都没有针对性的去做相应的优化,所以借着保证产品质量的出发点,自己定了相关的性能优化方案,可能不太成熟,不过可以逐步完善,并找到最适合自己产品的优化方案。

这里我定了四个方向:

- 响应时间(Response Time

- 界面卡顿(ANR

- 耗内存(Memory

- 内存泄露(Out of memory)

响应时间

这里指的是客户端与服务端交互,拿到数据、解析、再到显示到界面整个过程耗费的时间。

这个部分涉及客户端的优化,也涉及服务端的优化,这里只讨论客户端。

HTTP请求方式

我们的app一般离不开网络,请求接口是最平常的操作了,如何请求,请求什么我们在开发初期就要定好,服务端给我的提供的接口,大致可以通过GETPOSTHEADPUTDELETE这几种请求方式,不同的请求方式有不同应用场景,比如GET请求,应当用来请求返回结果,参数是作为url的一部分;POST请求,用于请求会更改服务端数据或状态;HEAD请求跟GET一样,只是服务器不能在响应里返回消息主体;PUT请求,用于将网页放置正确的地方;DELETE请求用于删除服务器指定文档。

使用优秀的开源Http框架是我们比较好的选择,它的优点是经过市场的验证,很多坑都被填过,缺点也是我们需要去深究它才能对其进行扩展,遇到坑也不一定能填。

如果自己造轮子的话,还需要我们花时间去验证去适应我们的业务需求,但好处是我们可以自己去扩展可把控,不过这很考量开发者的素质。

数据解析

实际开发当中服务端的返回数据格式无非就两种:

- JSON

- XML

这两种格式数据格式各有优劣,从可读性来看,xml略微好一点,不过JSON也有规范的标签,从解析难度和速度来看,大家都比较倾向使用JSON,目前JSON也是主流的数据格式。

Android中均可以使用优秀的解析库来加快我们的解析速度,XML中有dom4jJSONJacksonGson,我们通过这些库实现我们更快的完成数据解析,提高我们的开发效率。

数据存储

上一节讲的是数据解析,我们解析完后的数据,可能就需要将数据存储在某个地方,Android的五种存储方式:

- Content Provider(主要用来向其他应用程序共享数据)

- SQLite(存储数据到数据库中)

- File(本地文件保存)

- SharedPreference(主要用来保存简单的配置信息)

- 网络存储(WebService返回的数据或是解析HTTP协议实现网络数据交互)

为了提高应用程序的响应时间,数据缓存是一个比较好的方式,我们可以预处理服务器返回的数据,对数据进行缓存刷新。

优化点:

- 异步请求网络数据

- 预处理服务器返回数据

- 异步进行数据存储操作

- 数据缓存刷新

- Timeout超时重试

- 在主线程中操作UI

界面卡顿

ANR表示应用程序无响应,这个是需要我们避免发生的事情,出现这个异常的原因:

- 主线程 (“事件处理线程” / “UI线程”) 5秒内没有响应输入事件

- BroadcastReceiver10秒内没有执行完毕

导致ANR的原因有很多,一般情况就是在UI线程做了耗时的操作,例如网络请求、数据库操作。

那么如何避免?

- UI线程只做界面刷新,不做任何耗时操作,耗时操作放在子线程来做

- 可以使用Thread+handle或者AsyncTask来进行逻辑处理

耗内存

每部手机的内存有限,我们这里所说的内存指的是手机的RAM,它是Ramdom Access Memory的缩写,我们应用程序的需要随机读写的数据就存在RAM中,Android手机之所以会比较耗内存,这跟Android后台的处理有关,我们知道Android应用是使用Java开发的,运行Java需要有虚拟机,说明每开启一个应用都会创建一个虚拟机,而这是需要内存的,所以我们开的应用越多,后台进程越多,内存都分配出去了,才导致内存消耗的严重。