【Android】【性能优化】内存优化 性能优化 ANR预防

  1. 使用AndroidStudio内置的AndroidProfiler进行内存监控分析:
    单击定位某个时间点的内存状态
    点击左上角DumpJavaHeap按钮,生成内存记录文件
    在下方面板查看分析结果,可以浏览所有类和实例占用的内存大小
  2. 出现内存泄漏的场景情形:
    集合类引用对象
    静态变量/单例对象引用对象
    非静态内部类/匿名内部类引用对象
    资源未关闭
  3. 防止内存泄漏,内存溢出的方法:
    对大图片进行压缩(减少像素,降低颜色质量)后再加载
    条件允许的情况下,对图片及时进行回收
    在适当情景下,使用软引用弱引用来替代强引用
    集合中不再使用的对象,及时remove
    不再使用的对象,手动设置为null,提高被回收几率
    不要在子线程或者静态变量中引用Activity
    在Activity中使用静态内部类来代替内部类,因为非静态内部类会依赖于Activity
    在允许的情况下,使用ApplicationContext代替ActivityContext,这样可以降低Activity被强引用的几率
    对于需要频繁加载的图片(如ListView,RecyclerView,GridView中,加载网络图片等),使用缓存或多级缓存
    对于需要频繁使用的对象(如ListView的Item,ViewPager中的Fragment,线程,数据库连接等),使用对象池技术复用对象
    大量的字符串拼接,使用StringBuilder或StringBuffer来代替字符串相加
    对于需要关闭销毁解绑的对象,要及时关闭销毁解绑(如Stream,Cursor,WebView,Receiver等)
    优化Layout嵌套结构,避免产生多余的View
    使用AndroidProfiler来监控内存泄漏
  4. 其它性能优化方法:
    使用重用布局,使用减少布局层级,使用延迟加载
    自定义组件时,不要在onDraw方法中频繁创建对象,经常使用的对象,在构造方法中一次性创建
    在ListView等组件中,复用itemView,避免每次都创建View,使用ViewHolder,避免每次都findViewById
    使用RecyclerView等优化过的控件,来代替ListView
    在ListView/RecyclerView/GridView等控件中,如果数据源过大,考虑异步加载和分页加载
    避免过度创建对象
    尽量不要使用枚举类
    常量使用static和final来修饰
    使用Android优化过的数据结构(SparseArray等)
    对需要频繁加载的网络资源,使用磁盘缓存和内存缓存
    在Gradle中使用minifyEnabled和shrinkResources来精简无用的代码和资源
  5. ANR定义:
    ANR即Application Not Responding,应用程序无响应,本质上即是一个超时监听
  6. ANR触发条件:
    KeyEvent:5秒内未处理完成
    BroadcastReceiver:10秒内未处理完成
    Service:20秒内未处理完成
  7. ANR避免方法:核心点就是不要在主线程中执行耗时较长的操作
    文件操作,数据库操作,网络操作,硬件操作,解压图片操作,长时间任务,都要放到子线程中取执行,执行完毕通过Handler更新UI
    BroadcastReceiver和Service也是运行在主线程中,也要开启子线程来执行长耗时操作
    不要在主线程中使用可能产生阻塞的代码,比如sleep,wait,lock,future.get等

你可能感兴趣的:(android)