总结

知识深入系列:

1、anr 透析;

There are some common patterns to look for when diagnosing ANRs:

The app is doing slow operations involving I/O on the main thread.

The app is doing a long calculation on the main thread.

The main thread is doing a synchronous binder call to another process, and that other process is taking a long time to return.

The main thread is blocked waiting for a synchronized block for a long operation that is happening on another thread.

The main thread is in a deadlock with another thread, either in your process or via a binder call. The main thread is not just waiting for a long operation to finish, but is in a deadlock situation. For more information, see Deadlock on Wikipedia.

traces.txt

traceView

http://gityuan.com/2019/04/06/android-anr/

Android系统增加的ANR机制的本质,其实都是监控主线程是否发生阻塞,所以要避免ANR,记住一条,就是:

1、避免在主线程执行耗时的操作

2、在Service、BroadcastReceiver、ContentProvider中如果需要执行耗时的操作,请采用合适的多线程技术进行异步调用

2、布局优化;

 https://blog.csdn.net/u014313623/article/details/49465531?spm=1001.2014.3001.5501

3、列表优化;

recyclerView

4 级缓存:

1、scrap

final ArrayList<ViewHolder> mAttachedScrap =new ArrayList<>();

private ArrayList<ViewHolder> mChangedScrap =null;

没有限制大小,只是屏幕上的 Item

2、ViewCacheExtension

(1)自定义的cache,自定义自己的缓存策略,可针对特殊的类型例如广告做缓存,自定义缓存数据,避免重新bind,

(2) mViewCacheExtension .getViewForPositionAndType(this, position, type) 返回View 参数 LayoutParam需要自带 ViewHolder,

LayoutParams  内部有个参数ViewHolder,感觉不合理,布局参数 为什么有ViewHolder,很奇怪 既然返回的是一个 View,但是有个隐含的要求要ViewHolder 也要返回,ViewHolder  内部也有 position参数,如果和参数position 不同就奇怪了,所以不是一个好的设计,存在潜在的依赖关系;

(3) viewHolder存储在自定义缓存的地方 ,导致recycler 内部的数据跟新 覆盖不了

3、viewCache

(1) 主要用途是对反复滑动的场景,保存的 viewHolder 不需要rebind,因为保存的数据包括了viewHolder和对应的position,所以对于选择类的应用可以考虑扩大viewCache的size

(2) viewCache 装满后,会将最早进入的对象溢出对象会存到recyclerPool,

ArrayList  remove 一个元素后 会重新做元素拷贝,造成内存抖动;


4、recyclerPool :

(1) 默认缓存大小为 5,根据实际需要  调整recyclerPool 的大小

  (2)    setRecycledViewPool    使多个recyclerView共用一个缓存池,避免构建多个recyclerView对象,或者对同一种type的缓存池复用;

  (3) setRecycledViewPool   是栈的结构,先进后出,后进先出,所以onBindViewHolder 可能复用的就是原来这个位置的viewHolder,在 bind的时候重新check position,避免重复的bind 操作;

缓存查找流程:

1、Search changed scrap

2、Search attached scrap

3、Search non-removed hidden views

4、Search the view cache

5、If Adapter has stable ids, search attached scrap and view cache again for given id.

6、Search the ViewCacheExtension

7、Search the RecycledViewPool

优化措施:

1、减少布局嵌套层数  merge ,自定义 View

2、延迟 加载 View, viewStub,对于只显示一次的 View 使用 new View,add 的形式实现,不写进布局

2、列表滑动期间 不加载图片  addOnScrollListener

3、inflate view  涉及io, 通过new View 的形式创建对象

4、重写 RecyclerView.onViewRecycled(holder) 来回收资源

5、如果recyclerView 高度固定的话设置这个属性,避免invalidate 

public void setHasFixedSize(boolean hasFixedSize)

6、调整缓存大小  RecycleView.setItemViewCacheSize(size)

7、共用一个监听器  共用一个 pool

8、设置唯一的 id  

定义 固定的id:

1、根据id 进行diff,确定有变化的item才会进入pool,避免 pool  超出,而造成重新构建viewHolder

2、item变化时  只需调用notifyDataSetChange既可,不需要精确哪个 item 变化,DiffUtil 会自动计算

4、内存泄漏彻底解析;

内存泄漏常见case:
1、匿名内部类,handler

2、注册监听器,没有反注册

3、静态引用,例如单例

4、资源未关闭 fileStream   cursor 

调试工具:

1、adb shell dumpsys meminfo

2、leakcanery  ---引流 rxjava

5、性能优化

1、代码可读性好,代码风格遵循clean code;

2、减少成员变量;

3、函数内部尽量少涉及成员变量;

4、控制函数参数个数;

5、减少重复逻辑;

6、

6、启动优化


7、吹水

1、hook;

2、ok http;

3、retrofit 动态代理

4、rxjava

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容