美文网首页
Android性能优化

Android性能优化

作者: 邓立_全栈UncleLi | 来源:发表于2021-05-24 13:42 被阅读0次

关于ANR

  • 什么是anr

    • 应用程序无响应弹框
  • 造成anr的原因

    • 主线程做了耗时操作
  • android中那些操作是在主线程

    • activity的所有生命周期回调都是执行在主线程
    • Service默认是执行在主线程的
    • BroadcaseReceiver的OnReceiver回调执行在主线程
    • 没有使用子线程的Handler的handerMessage,post(Runnable)执行在主线程
    • AsyncTask的回调中除了doInBackground,其他的都是执行在主线程
  • 如何解决Anr

    • 使用AsyncTask处理韩式IO操作
    • 使用Thread或者HandlerThread提高优先级
    • 使用handler来处理工作线程的耗时任务
    • actiivty的onCreate和onResume回调中尽量避免耗时的代码

关于OOM

  • 什么是OOM

    • 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
  • 如何解决OOM

    • 有关bitmap优化
      • 图片显示(比如RecyclerView滑动,滑动时不加载图片)
      • 图片压缩
      • 计时释放bitmap.recycler()
      • 使用Lru最近最少使用LruCache来存储对象put(key,value),使用的LinkHashmap
      • 使用BitmapFactory。Options来计算inSampleSize(图片的缩略比)
      • 三级缓存(内存、本地、网络)

内存抖动

  • 什么是内存抖动

    • 内存抖动是指存在短时间内频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致oom
  • 内存抖动的原因

    • 瞬间产生大量的对象会严重占用新生代的内存区域,当达到阈值,剩余控件不够的时候,就会触发GC,系统话费再GC上的时间越多,进行界面绘制或流音频处理的时间就越短。即使每次分配的对象占用了很少的内存,但是叠加在一起回增加heap的压力,从而触发更多其他类型的GC.这个操作有可能会影响到帧率,并使得用户感知到性能问题。

内存泄漏

  • 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏

  • 内存泄漏原因:

    • 静态变量

      • 静态变量的生命周期和应用的生命周期一样长。如果静态变量持有某个Activity的context,则会引发对应的Activity无法释放,导致内存泄漏。如果持有安排偏离擦听得context就没有问题
      • 常见:单列模式:内部实现是静态变量和方法
      • 静态的View:view默认持有Actiivty的context
    • 非静态内部类和匿名内部类

      • 常见:Handler,AsyncTask,TimerTask等,一般在处理多线程任务的时候
      • 非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用
    • 当使用Actiivty的context注册监听,不再需要监听的时候没有取消注册

    • 资源对象为关闭:BraodcastReceiver,ContentObserver,File,CUR搜人,Stream,Bitmap等资源,使用后未关闭会导致内存泄漏

UI卡顿

  • 在UI线程中中轻微耗时操作,会导致UI线程卡顿
  • 布局Layout过于复杂,无法再16ms内完成渲染
  • 同一时间动画执行次数过多,导致CPU或GPU负载过重
  • View过度绘制,导致某些像素再同一时间内被绘制多次,从而导致 CPU,GPU负载过重
  • view频繁的触发mesure,layout,导致measure,layout累计耗时过多以及整个view频繁的重新渲染
  • 内存频繁触发GC过多,导致展示阻塞渲染操作

相关文章

网友评论

      本文标题:Android性能优化

      本文链接:https://www.haomeiwen.com/subject/whwhjltx.html