一、布局优化:
1、优化方式:
* 减少不必要嵌套,尽可能使用LinearLayout、ConstraintLayout等控件
* 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色
* 使用include、merge、ViewStub
* include:布局复用
* merge:去除多余层级
* ViewStub:按需加载,当调用setVisibility或者inflate方法时才将布局加载到内存中
2、检查方式:
一般打开开发者选项中,调戏GPU过渡绘制的按钮,通过查看布局颜色深度来检查过渡绘制的情况
二、绘制优化:
每帧绘制时间不超过16ms
1、优化方式:
* 减少在onDraw方法做耗时操作(循环等)
* 毕业大量创建局部对象,因为onDraw会频繁调用,导致产生大量临时对象,引起过多占用内存和频繁GC
三、内存优化:
- 避免内存泄漏的出现
- 线程优化:使用线程池
- 压缩Bitmap
- 不要通过Intent传递大数据(1MB)
- 页面退出时注意清理动画、回收图片资源等
1、内存泄漏
无用对象的内存得不到及时释放。因为长生命周期的对象持有短生命周期的引用,导致短生命周期的对象无法被回收。
2、常见内存泄漏:
* 集合对象泄漏
* 静态变量、单例持有对象
* 非静态内部类、匿名内部类持有外部类引用
* 资源未关闭
3、举例说明:
(1) 静态集合:
public static List<Object> sObjects = new ArrayList<>();
public void newList(){
for (int i = 0; i < 100; i++) {
sObjects.add(new Object());
}
}
静态集合只有多个对象,导致没法被回收
解决方式:使用完毕后将集合清理
sObjects.clear();
sObjects = null;
(2)单例:
public class SingleInstance {
private static SingleInstance sInstance;
private Context mContext;
private SingleInstance(Context context){
this.mContext = context;
}
public static synchronized SingleInstance getInstance(Context context) {
if (sInstance == null) {
return new SingleInstance(context);
}
return sInstance;
}
}
单例生命周期为全局的,如果传入的Context为Activity,导致Activity无法回收。
解决方式:使用ApplicationContext
public static synchronized SingleInstance getInstance(Context context) {
if (sInstance == null) {
return new SingleInstance(context.getApplicationContext());
}
return sInstance;
}
(3)、静态、匿名内部类:
public class HandleActivity extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
}
常用的创建一个Handler子类,为非静态内部类,会持有外部类(Activity)的引用,导致Activity无法被回收。
解决方式:将MyHandler改为静态内部类,自动不会持有外部类的应用。
可能的问题:如果需要在Handler持有Activity(例如更新UI)
处理方式:使用弱引用(GC的时候无论是否被持有都会被回收),根据实际应用场景使用。
static class MyHandler extends Handler{
//使用弱引用,GC的使用Activity可被回收
WeakReference<HandleActivity> activity;
MyHandler(HandleActivity activity) {
this.activity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
(4)资源未关闭:
* 网络、文件流、数据库Cursor等
* 广播取消注册,EventBus取消注册等
4、泄漏检查方式:
可集成LeakCanary检测、使用Memory Monitor或者使用Android studio中的Android Profiler检测。
四、响应速度优化:
1、应用启动初始化:
* 减少在Application所做的初始化操作,根据业务逻辑可以将统计事件、广告等SDK的初始化的操作移动启屏的Activity中。
* 部分SDK可通过异步线程进行初始化
* 如果存在多进程的情况,Application会多次实例化,只在主进行中进行初始化操作
2、避免ANR的出现
* 不要在Service中做耗时操作,可使用IntentService(线程、自动销毁)
* 不要在BroadcastReceiver的onReceiver中执行耗时操作,可创建IntentService完成