Android之性能优化问题

1、UI优化

  • 在xml布局文件中,合理选择RelativeLayout、LinearLayout、FrameLayout,其中RelativeLayout会让子View调用两次onMeasure()方法,并且布局复杂时,onMeasure也相对复杂,效率比较低;在LinearLayout中,当weight>0时,也会让子View调用两次onMeasure
  • 布局复杂时,尽量使用<include>标签、<merge>、<ViewStub>
  • 减少布局层级,可以通过开发者选项->GUP过度绘制查看,一般控制在4层以内,超过5层时需要考虑重新排版布局。
  • 在自定义View中,重写onDraw方法时,不要在内部新建对象,否则容易引发GC,导致性能下降。
  • 重写Adapter的getView()方法时,尽量复用convertView,并且用holder减少findViewById()加载View的次数
  • 在图片的周围结合字体时,尽量采用TextView的drawableLeft或者drawableTop等方法,来代替ImageView+TextView的布局
  • 去除不必要布局,如:getWindow().setBackgroundDrawable(null)

2、性能优化

思想:避免OOM和频繁触发GC导致性能下降

  • 一些系统资源使用过后要及时回收,比如:Bitmap.recycle(),Cursor.close,inputStream.close()
  • 当大量加载Bitmap时,最好根据View的大小加载Bitmap,合理选择采样大小inSampleSize,以及图像的编码方式如RGB_565
  • 对于需要缓存的,如请求的数据、加载的图片等,最好采用LruCache策略
  • 使用静态内部类+WeakReference 代替内部类,如Handler ,线程AsyncTask
  • 当需要建立多条线程时,考虑使用线程池,避免频繁创建和销毁线程
  • 当采用单例模式持有Context对象时,记得释放,或者使用全局上下文
  • 属性动画造成内存泄漏

3、响应速度优化

出现ANR的情况:

  • Acitivity在5s内无法响应屏幕的触碰事件或者键盘输入事件
  • BroadcastReceiver在10s内未执行操作
  • Service在20s内未执行操作

解决方案:

  • 开启子线程执行耗时操作
  • 在子线程中如果需要更新UI,结合Handler、AsyncTask、IntentService进行通信,注意自定义view的两种刷新方法:invalidate()postInvalidate()

4、其他的性能优化:

  • 常量尽量使用static final修饰(在类初始化时优先加载static修饰的常量,并且后续再创建该类对象,不会执行初始化操作)
  • 使用线程池管理线程
  • ArrayList遍历采用for循环,LinkedList遍历使用foreach
  • 不要过度使用枚举,枚举占用内存比整型大
  • 字符串的拼接优先考虑使用StringBuffer和StringBuilder

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/85108590