Android性能优化方法

前言

为什么要进行性能优化?Android作为移动平台,不管是内存或者cpu的性能都受到了一定的限制,过多的使用内存会导致OOM,过多的使用cpu资源,一般指做大量的耗时任务,将会是设备变得卡顿甚至出现ANR异常。

优化的方式

I. 布局优化

布局优化的思想:尽量减少布局的层级,减少绘制界面时的工作量。具体如何做:
方式一:
①去除一些无用的布局,View;
②有选择性的使用布局:比如能使用RelativeLayout也可以使用LinearLayout的地方使用后者,尽量少使用性能低的ViewGroup;
③减少层级优先级高于对ViewGroup性能的考虑。

方式二:使用<include><merge>标签和<ViewStub><include>标签用于布局重用,<merge>标签一般和<include>标签配合使用,它可以减少布局的层级,而<ViewStub>提供了按需加载的功能,当需要使用时再加载布局到内存,这可以提高应用程序的初始化效率。但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用View可见性的控制。

首先来说说ViewStub的一些特点:
1、ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2、ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

基于以上的特点,那么可以考虑使用ViewStub的情况有:
1、在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。

2、想要控制显示与隐藏的是一个布局文件,而非某个View。
因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。

II.绘制优化

绘制优化指的是避免在View的onDraw方法中执行大量的操作。主要体现在两个方面:
①在onDraw方法中不要创建新的对象,因为onDraw方法会频繁调用,这会产生 大量的临时对象,不仅占用内存高而且可能导致频繁的gc而影响程序的执行效率。
②避免在onDraw方法中执行耗时操作或者成千上万的循环操作,大量的循环会抢占cpu时间片,这将导致View的绘制出现卡顿现象,根据Google官方给出的性能优化典范中的标准,view的绘制帧率保证60fps是最佳,这就要求每帧的绘制时间为16ms(16=1000/60),虽然程序很难做到这点,但是降低onDraw方法的复杂度确是切实有效的。

III.内存泄漏优化

内存泄漏在开发中是需要重视的一个问题,但是内存泄漏问题对开发人员的经验和开发意识有较高的要求。内存泄漏优化主要分为两个方面:
①避免写出内存泄漏的代码;
②通过一些分析工具如MAT来找出内存泄漏的代码继而解决;

IV.响应速度优化和ANR日志分析

响应速度优化的核心思想是避免在主线程中做耗时操作,但是有时候确实有很多耗时操作,可以考虑放到子线程中执行,就是采用异步的方式去处理耗时操作。响应速度过慢更多的体现在Activity的启动上,如果在主线程中做过多的操作,可能会导致Activity启动过程出现黑屏,甚至出现ANR异常。Android规定activity5秒内不能响应输入事件就会出现ANR,而BroadcastReceiver 10 秒内还没执行完操作也会出现ANR异常。ANR异常很难再代码中发现,如何定位?当出现ANR异常时,系统会在data/anr目录下创建一个trace.txt文件,通过分析这个文件来定位分析ANR的原因。

V. ListView和Bitmap优化

ListView主要分三个方面:
①采用ViewHolder并避免在getView方法中做耗时操作;
②要根据列表的滑动状态来控制任务的执行频率,比如当列表快速滑动是显然不适合开启大量的异步任务;
③尝试开启硬件加速来优化来是ListView的滑动更加顺畅。

VI.线程优化

线程优化的核心思想是使用线程池,避免程序中存在大量的线程,通过线程池可以重用线程,减少由于线程的创建销毁带来的系统消耗,同时线程池也可以有效地控制线程池中最大的并发数,避免大量线程因互相抢占系统资源而导致阻塞。

VII. 一些性能优化建议

①避免过多的创建对象;
②不要过多使用枚举,枚举占用的内存比整形大;
③常量请使用 static final 来修饰;
④使用一些Android特有的数据结构,如SparesArray和Pair等,他们都具有更好的性能;
⑤适当使用软引用和弱引用;
⑥采用内存缓存和磁盘缓存;
⑦尽量采用静态内部类,这样可以避免潜在的由于内部类引起的内存泄漏。

《Android开发艺术探索笔记》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容

  • 前言 本节将介绍一些有效的性能优化方法,主要内容包括布局优化,绘制优化、内存泄漏优化、响应速度优化、ListVie...
    Liuuuuuuzi阅读 486评论 0 4
  • 学习资料 《Android开发艺术探索》 布局优化 思想概述: 尽量减少布局文件的层次(android绘制时的工...
    sun_goden阅读 401评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,283评论 25 707
  • 本篇主要说些Android性能优化的几种方法,主要包括布局优化、绘制优化、内存泄漏优化、响应速度优化、ListVi...
    深情不及酒伴阅读 363评论 0 1
  • 他开始了自己的创业之路,没有鲜花,没有掌声,却有来自外来的阻力,他内心对自己说,不用理会,默默去做就是了,尽自己最...
    驼铃星阅读 262评论 0 0