安卓面试总结——性能优化

优化

1.ANR

无响应,acitivity最大执行事件为5s,broadcastReceier中最大执行时间为10s

应用的响应由ActivityManager和windowManager监视

原因

1.主线程被IO操作阻塞(4.0后网络IO不允许出现在主线程中

2.主线程中有耗时计算

主线程操作

1.Activity的回调

2.service默认在主线程,处理耗时操作

3.BroadcastReceiver的onReceive回调

4.没有使用looper和handler的handleMessage,post(runnable)

5.AsyncTask的回调中(除了doInBackGround)

解决

1.AsyncTask 处理IO操作

2.Thread(子线程不可创建handler)或者handlerThread(可创建handler)提高优先级

3.handler处理耗时操作

4.Activity的oncreate和onresume不做耗时操作

systrace + 函数插桩

2.OOM

申请的内存资源超过dalvik虚拟机的最大内存限制

内存溢出

内存抖动 短时间产生大量对象并很快回收

内存泄漏 导致内存溢出

bitmap

1.显示缩略图

2.listview滑动停止再调用网络请求

3.及时释放内存,通过JNI再c中释放内存

4.图片压缩

5.使用inbitmap属性,销毁不用的bitmap

6.捕获异常

其他listview

1.convertview的复用,大图控件使用LRU策略

2.避免ondraw的时候执行对象创建

3.谨慎使用多进程,业务不大则少用,使用不当会有其他crash

3.bitmap

1.recycle 

     1.回收JAVA

     2.回收native

2.LRU策略

    一个泛型类,用linkedHashmap实现,提供get和put方法来添加和获取缓存对象,当缓存满了的时候,调用trimtosize方法,把较早的对象移除

3.计算insampleSize值 来适当缩放大小

4.缩略图 

    BitmapFactory 

5.三级缓存  网络 本地 内存

4.UI卡顿

轻量ANR

流畅60fps,16ms处理完

GPU选项 减少红色,多蓝色

overDraw 大量重叠,非必要背景

原因:

1。人为地再UI线程中做轻微耗时操作

2.layout过于复杂,无法再16ms内完成渲染

3.同一时间动画执行次数过多,导致CPU和GPU负载过重

4.view过度绘制,导致某些像素在同一祯内绘制多次

5.view频繁出发measure,layout,导致耗时过多,整个view频繁重新渲染

6。view频繁GC,暂时阻塞渲染操作

7.冗余资源及逻辑等导致加载执行过慢(使用异步任务处理,启动顺序等

优化

1.include,merge

     merge标签可以减少视图树中的节点个数,加快视图的绘制,提高UI性能。

    少嵌套,若通用,使用include导入,使用Gone代替Invisibel(仍然绘制

    使用weight代替长宽减少计算,item复杂嵌套时使用自定义view

2.列表及adapter优化

    尽量复用listview在adapter当中的getview方法,不要重复获取实例

    使用convertview ,列表滑动时不进行listview更新,并用viewholder代替findviewbyid

 3.减少不必要的背景设置,图片压缩

4.使用性能消耗更小布局(TableLayout、ConstraintLayout)

5.通过使用半透明颜色值(#77000000)代替透明色

6.使用ViewStub懒标签,延迟加载不必要的视图

5.内存泄漏

1.JAVA内存分配策略

  静态存储区==方法区 线程共享

       静态数据 常量 全局变量

      保存系统的类信息。比如类的字段、方法、常量池等,在app整个运行期间都存在

  栈区 内存分配连续 线程私有 

         局部变量表、操作数据栈和帧数据区

         局部变量表:用于报错函数的参数及局部变量

   操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。

         帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析

        基本数据类型和对象引用变量

      方法内的局部变量会在栈上创建内存空间,并在方法执行完后被自动释放   

  堆区 ==动态内存分配 线程共享

         new出来的对象 ,会被java GC

2. java内存管理

    无引用对象的会被回收

3.java内存泄漏

    无引用对象持续占用内存或得不到及时释放,造成内存空间浪费

    1.单例 静态属性

         单例持有activity的context会泄漏,应该使用应用的引用,getApplicationContext

    2.匿名内部类

         非静态内部类默认持有外部类引用给,使用静态内部类

    3.handler

         也是非静态内部类的问题

         改为静态内部类,并持有外部类的弱引用,removeCallbacksandMessages

    4.避免static成员变量

         占用内存过大,容易被系统优先回收

    5.资源未关闭

         contentObserver ,游标,socket,bitmap,广播接收器

    6.AsyncTask和handler类似,

         在ondestroy的时候cancel

6.内存管理

1.Android内存管理机制

    分配机制:弹性分配要求,初始不会分配太多内存,由Ram大小决定

    回收机制  进程优先级 前台--可见--服务--后台--空

2.特点

    占内存少,合理释放资源,内存紧张时可以释放不重要内存,在特殊生命周期中保存式还原重要数据

3.优化

    1.service完成后,尽量停止,可用intentService(开启子线程,可自动推出

    2.UI不可见时,释放资源

    3.内存紧张时,释放不重要资源

    4.避免滥用bitmap,压缩+LRU

    5.使用针对内存优化的数据结构,arraymap代替hashmap

    6.避免使用依赖注入的框架 dagger2

    7.使用zip对齐apk

    8.使用多进程,消耗多且需要长期运行的模块,webview

7.其他优化

1不用静态变量存储数据 

    使用文件 sp,contentPRovider

2.sharedPreference

    不能跨进程同步,进程不安全

    apply不反回结果,commit返回

    sp文件过大,kv模式存储配置信息,不能过大,不然阻塞主线程,UI卡顿,而且解析起来产生大量对象

3.内存对象序列化

    序列化,java中将对象状态信息转换为可存储或者可传输的形式

    putExtra只能传输基本数据类型

    若为复杂对象,需要实现serailizable接口,产生大量临时变量,影响UI性能,使用磁盘存储比较安全

                          或者实现parcelble接口,不能使用存储在磁盘上的数据,使用内存时,用parcelble较好

4.避免UI线程中耗时操作

    可以使用strictMode追踪ui卡顿,在oncreate中开启

8listview

ArrayAdapter:简单易用的Adapter,通常用于数组或list集合的数据源(多个值包装成多个列表项)。

simpleAdapter:并不见得、功能强大的Adapter,可用于list集合的多个对象包装成多个列表项。

simpleCursorAdapter:与上相似,但是用于包装jCursor(数据库游标)提供的数据源。

BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

增加优化一:convertView的使用,主要优化加载布局问题

1.listivew每次滚动都会调用gitview()方法,所以优化gitview是重中之重。

通过JUnit进行Android单元测试

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,407评论 1 4
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,209评论 0 11
  • 1.List<T>和List<?>的区别? List<T>是泛型,List<?>是泛型类型通配符,相当于List<...
    小酷哥阅读 890评论 0 2
  • 放假了,圣诞假期,二周。 圣诞是个安安静静的节,只是节前分外热闹,特别是学校各种Party接连着。 今天学校终于放...
    nan_jia_gg阅读 152评论 0 2