内存问题
内存泄漏的可能原因
- 非静态内部类的静态实例(例如Handler)
- IO操作后,没有关闭文件导致的内存泄露
- 自定义View中使用TypedArray后,没有recycle
- 某些地方使用了四大组件的context,在离开这些组件后仍然持有其context导致的内存泄露
- 注册某个广播等之后,没有进行反注册
- 集合中的对象没有清理造成泄漏
- Bitmap没有及时回收
- Cursor、File等资源没有关闭导致的泄漏
- Adapter的View没有复用
- 频繁的创建对象
卡顿问题
- UI线程执行读取数据库
- UI线程请求网络
- 过渡绘制
- 内存抖动
- 系统内存不足
功耗问题
- 内存占用大
- 内存泄漏
APK的体积问题
- 1.尽量使用一套图片资源,放在xhdpi
- 2.inspect code 检测没有用的图片
- 3.
- 4.jpg代替png
- 5.占用大的,使用webp
- 6.so库
- 7.资源混淆
- 8.程序可以实现的,就不要用图片。
- 9.
- 10.
代码优化
- 不规范的命名
- 无用的import
- 父
1.Handler的使用
**工具检测:**Android Studio 静态检测工具
解决方式:非静态内部类。在应用中大量的用到Handler对象,如果在Activity返回的时候,Handler没有及时释放,这个时候,持有对Activity的应用。就会导致内存泄漏。
示例代码
private MyHandler mF93Handler = new MyHandler(this);
static class MyHandler extends Handler {
private WeakReference<CldModeF93> mWeakRe;
public MyHandler(CldModeF93 mFragment) {
mWeakRe = new WeakReference<CldModeF93>(mFragment);
}
public void handleMessage(Message msg) {
CldModeF93 mCureentFra = mWeakRe.get();
mCureentFra.dealMsg(msg);
}
};
private void dealMsg(Message msg) {
switch (msg.what) {
case CLDMessageId.MSG_ID_LIST_ANIMATION: {
getImage("imgAshes").setVisible(true);
break;
}
}
}
2.UI线程执行耗时的操作
工具检测: StrictMode严格模式
解决方式:耗时的操作,放到工作线程中去执行。
**参考链接:**Android性能调优利器StrictMode
3.过渡绘制
工具检测: hierarchyviewer、GPU呈现模式分析(手机设置中打开)
解决方式:
- 尽量使用标签merge、ViewStub、include
- 尽量减少过多的嵌套布局
- 去掉系统主题中的布局,换成在每个界面独自添加背景