Android性能优化面试题汇总

启动黑白屏

安装app后,启动时会有短暂的白屏,这大大影响整体的美观,姑且在这里也给算在性能优化这一块

出现白屏原因:

系统加载布局文件是需要时间的,在刚启动时布局文件还没加载完毕(即setContentView(int)之前)显示的是window背景,出现的白屏(或黑屏)是window的背景色

解决办法

替换window的背景(可为图片或纯色)
只需在启动activity界面根标签下设置android:theme="@style/MyTheme"属性
自定义一个style

<style name="Mytheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="android:windowBackground">@mipmap/ic_launcher</item>//设置图片

        <item name="ndroid:windowBackground">@color/fireBar</item>//设置纯色

        <item name="android:windowNoTitle">true</item>//去title

    </style>

注意事项

设置属性只能设置在启动页,不能设置在application标签下,此标签代表全局
设置图片最好是.9.png类型图片(此种图可适配机型),若使用.png图片需考虑不同机型适配问题(切多种分表率的图)

布局优化

减少嵌套的层级(可使用约束布局),减少嵌套层级可加快加载效率,

使用style提取相同view的公共属性,减少重复代码

使用include标签

合理使用ViewStub

图片的优化

android中图片的使用是非常占用内存资源的。

①:在图片未使用时,及时recycle()回收
②:使用三级缓存,内存-sd卡-网络
内存中再次获取最快,由于内存有限可能被gc回收,sd卡中的图片不会回收,当前面两种都不存在所需图片时,才去网洛下载
③:将大图片进行压缩处理再放到内存中,用到BitmapFactory类

/**创建缩略图方法

*filepath 图片路径

i  压缩比例,最终为原图的1/(i^2)

*/

private Bitmap onCreateThumbnail(String filePath, int i) {

        BitmapFactory.Options options=new BitmapFactory.Options();

        //设置为不读内容,值读取边界值

          options.inJustDecodeBounds=true;

        //通过编辑,得到边界值,并存入到option中

        BitmapFactory.decodeFile(filePath,options);

        //赋值缩放比例

        options.inSampleSize=i;

        //设置显示的图片格式

        options.inPreferredConfig=Config.RGB_565;

        //设置为读取内容,

        options.inJustDecodeBounds=false;

        //得到缩略图

        return BitmapFactory.decodeFile(filePath2, options);

    }

④:尽量不在Button上使用selector来设置点击与正常时背景图,因为在button初始化时会将选中状态与正常状态的两张图都加载都内存中,无疑在无意中加大了内存的占用,可xml中设置正常的背景,在setOnTouchListener监听中通过代码动态改变,在按下时显示选中状态北京,抬起恢复

final Button button=new Button(this);

        button.setOnTouchListener(new View.OnTouchListener() {

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){

                    case MotionEvent.ACTION_DOWN:

                        //手指按下

                        button.setBackgroundResource(R.mipmap.down);

                        break;

                    case MotionEvent.ACTION_UP:

                        //手指抬起,恢复

                        button.setBackgroundResource(R.mipmap.up);

                        break;

                }

                //为了监听事件的分发,返回false

                return false;

            }

        });

图片解码率也会影响图片所占内存

常见的png,JPG,webp等格式的图片在设置到UI上之前需要经过解码过程,而图片采用不同的码率,也会造成对内存的占用不同。
ARGB_4444 格式的解码率,这种格式的图片,看起来质量太差,已经不推荐使用。 而强烈推荐使用ARGB_8888来代替。一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bytes,即2个字节
ARGB_8888 格式的解码率,一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bytes , 共32bytes , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。
RGB_565格式的解码率,一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明, Red(R)值占5个bytes ,Green(G)值占6个bytes ,Blue(B)值占5个bytes,共16bytes,即2个字节。 对于半透明颜色的图片来说,该格式的图片能够达到比较好的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销,因此它是一个不错的选择。推荐使用

大量数据优化

分页加载
缓存方式
列表项优化

listview的优化

convertview的复用(View的复用)
viewholder类的使用,减少查找控件的次数(findviewbyid()次数),将holder与view绑定来实现(.setTag()、.getTag())

数据分页加载

RecycleView的优化

其他优化

网络优化

同一个页面数据尽量放到一个接口中去处理

使用Application Context代替Activity Context
谨慎使用static 关键字
static使用不当容易造成内存泄漏

数据库优化

电量优化

多线程并发引发的性能等

anr异常面试问题讲解

a) 什么是anr?

应用程序无响应对话框

b) 造成anr的原因?

主线程中做了耗时操作

c) android中那些操作是在主线程呢?

activity的所有生命周期回调都是执行在主线程的
Service默认是执行在主线程的
BroadcastReceiver的onReceiver回调是执行在主线程的
没有使用子线程的Looper的Handler的handlerMessage,post(Runnable)是执行在主线程的
AsyncTask的回调中除了doInBackground,其它都是执行在主线程

d) 如何解决anr

使用AsyncTask处理耗时IO操作
使用Thread或者HandlerThread提高优先级
使用handler来处理工作线程的耗时任务
activity的onCreate和onResume回调中尽量避免耗时的代码

oom异常面试问题讲解

a) 什么是oom ?

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的Out of memory异常

b) 一些容易混淆的概念

内存溢出 / 内存抖动 / 内存泄漏
内存溢出:就是oom
内存抖动:短时间内大量对象被创建然后马上被释放
内存泄漏:当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗

d) 如何解决oom

1.有关bitmap优化
图片显示(比如监听listview滑动,停止的时候加载大图)
及时释放内存
bitmap的够着方法都是私有的,通过BitmapFactory生成Bitmap到内存中都是通过jni实现的,简单点说会有俩部分区域,一部分是java区,一部分是C区,但是Bitmap是通过java分配的,不用的时候也是由java的gc机制回收的。对应C区域不能及时回收的,所以这里说的释放内存就是释放的c的那块区域(通过
recycle方法,该方法内部调用了jni的方法)。要是不释放只能等进程死了以后就会被释放

图片压缩

inBitmap属性(图片复用)

捕获异常

2.其它方法

listview:convertview / lru(三级缓存)

避免在onDraw方法里面执行对象的创建

谨慎使用多进程

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

推荐阅读更多精彩内容

  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,390评论 1 4
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,065评论 1 32
  • HereAndroid的内存优化是性能优化中很重要的一部分,而避免OOM又是内存优化中比较核心的一点。这是一篇关于...
    HarryXR阅读 3,791评论 1 24
  • 味蕾是情感的闸门,每一道菜都牵连着一些人,一种回忆,一段人生。 对我来说,火锅就是能瞬间勾起我最深的记忆。 那年我...
    齐帆齐阅读 847评论 18 39
  • 一部电视剧敢命名巜天道》,昭示了一种野心:要探寻规律,揭示本质,给予启示。贯穿全局的中心是一句台词:神即道,道法自...
    今善今美阅读 2,201评论 0 0