android异常与性能优化相关

2018-09-02  本文已影响0人  码农朱同学

1,ANR异常问题

1,什么是ANR

Application Not Responding
5s Activity

2,ANR产生的原因

应用程序的响应性是又Activity Manager 和WindowManger系统服务监视的
主线程耗时操作

典型的
Activity的所有生命周期回调都是执行在主线程的
Service默认是执行在主线程的
BroadcastReceiver的OnReceive回调是执行在主线程的
没有使用子线程的looper的Handler的handleMessage,post(Ruannable)是执行在主线程的
AsyncTask的回调除了 doInBackground,其他都是执行在主线程的

10s 广播

3,如何解决ANR

使用Aysnctask处理耗时IO操作
使用Thread(子线程不能创建handler)或者HanderThread (可以创建handler来发送消息,内部创建的looper关联了消息队列)提高优先级(必须的,不然还会anr)
使用handler来处理工作线程的耗时任务
Activity的onCreate和OnRume回调中尽量避免耗时的代码

2,OOM异常问题

1,什么是oom

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

2,一些容易混淆的概念

内存溢出、内存抖动、内存泄露

3,如何解决oom

3.1有关bitmap

图片显示
及时释放内存
图片压缩
inBitmap属性
捕获异常

3.2 其他方法

listview: convertview/lru
避免在onDraw方法里面执行对象的创建
谨慎使用多进程

3,Bitmap问题

1,recycle

java内存 ,c内存

2,lru

最近最少使用算法

3,计算inSampleSize

4,缩略图

5,三级缓存

4,UI卡顿问题

1,UI卡顿原理

60fps->16ms
overdraw

2,UI卡顿原因分析

1,人为在UI线程中做轻微耗时操作,导致UI线程卡顿
2,布局layout过于复杂,无法在16ms内完成渲染
3,同一时间动画执行的次数过多,导致CPU或GPU负载过重
4,View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重
5,View频繁的除非measure、layout、导致measure、layout累计耗时过多及整改View频繁的重新渲染
6,内存频繁触发GC过多,导致暂时阻塞渲染操作
7,冗余资源及逻辑等导致加载和执行缓慢
8,ANR

3,UI卡顿总结

1,布局优化
gone而非invisible
自定义view
include形式导入
weight代替长款

2,列表及Adapter优化

滑动时

3,背景和图片等内存分配优化
4,避免ANR

5,内存泄露问题

1,java内存泄露基础知识

2,Android内存泄露

1,单例
2,匿名内部类
3,handler

4,避免使用static变量

5,资源未关闭造成的内存泄露
6,Aynctask

6,内存管理问题

1,内存管理机制概述

1,分配机制
2,回收机制

2,android内存管理机制

1,分配机制
2,回收机制

3,内存管理机制的特点

1,更少的占用内存
2,在合适的时候,合理的释放系统资源
3,在系统内存紧张的情况下,能释放大部分不重要的的资源,来为android系统提供可用的内存
4,能够很合理的在特殊生命周期中,保存或者还原重要数据,以至于系统能够正确的重新恢复该应用

4,内存优化方法

1,当service完成任务后,尽量停止它
2,当UI不可见的时候,释放掉一些只有UI使用的资源
3,在系统内存紧张的时候,尽可能多的释放掉一些非重要资源
4,避免滥用bitmap导致的内存浪费
5,使用针对内存优化过的数据容器
6,避免使用依赖注入的框架
7,使用zip对齐的apk
8,使用多进程

5,内存溢出vs内存泄露

1,内存溢出
2,内存泄露

7,冷启动优化

1,什么是冷启动

1,冷启动的定义

冷启动就是在启动应用前,系统中没有改应用的任何进程信息

2,冷启动/热启动的区别

热启动 用户使用返回键推出应用,然后马上又重新启动应用(不走application)

3,冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。

2,冷启动流程

zygote进程中fork创建出一个新的进程
创建和初始化Application类,创建MainActivity类
inflate布局、当onCreate/onStart/onResume方法都走完
contentView的measure/layout/draw显示在界面上

Application的构造方法---》attachBaseContext()-->onCreate()-->Activity的构造方法---》onCreate()--->配置主题中背景等属性--》onStart()-->onResume()-->测量布局绘制显示在界面上

3,如何对冷启动的时间进行优化

1,减少onCreate()方法的工作量
2,不要让Application参与业务的操作
3,不要在Application进行耗时的操作
4,不要以静态变量的方式在application中保存数据
5,布局/mainThread

8,其他优化

1,android不用静态变量存储数据

2,有关sp的安全问题

1,不能跨进程同步
2,存储sharepreferenc的文件过大问题

3,内存对象序列化

1,serializeable java的序列化方式,会产生大量临时变量,引起频繁gc 在使用内存的时候,性能较差
2,parcelable Andrid的序列化不能使用在要将数据存储在磁盘上的情况

4,避免在UI线程中做繁重的操作

上一篇下一篇

猜你喜欢

热点阅读