android内存泄漏

内存问题
内存泄漏的可能原因
  • 非静态内部类的静态实例(例如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
  • 尽量减少过多的嵌套布局
  • 去掉系统主题中的布局,换成在每个界面独自添加背景
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值