常规方案
- convertView复用,使用ViewHolder。
- 耗时任务异步处理。
布局优化
- 减少布局层级,避免过度绘制。
- 异步inflate或者X2C
- Litho
图片相关
- 避免过大尺寸:GC频繁,内存抖动。
- 滑动时取消加载。
线程相关
- 使用线程池收敛线程,降低线程优先级。
- 避免UI线程时间片被抢占。
设置高度固定
- 如果item高度是固定的话,可以使用RecyclerView.setHasFixedSize(true);来避免requestLayout浪费资源。
onBinderViewHolder设置监听会导致对象重复创建
共用RecycledViewPool
- 在嵌套RecyclerView中,如果子RecyclerView具有相同的adapter,那么可以设置RecyclerView.setRecycledViewPool(pool)来共用一个RecycledViewPool。
- 如果LayoutManager是LinearLayoutManager或其子类,需要手动开启这个特性:layout.setRecycleChildrenOnDetach(true)
class OuterAdapter extends RecyclerView.Adapter<OuterAdapter.ViewHolder> {
RecyclerView.RecycledViewPool mSharedPool = new RecyclerView.RecycledViewPool();
...
@Override
public OuterAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView innerLLM = new RecyclerView(inflater.getContext());
LinearLayoutManager innerLLM = new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL);
innerLLM.setRecycleChildrenOnDetach(true);
innerRv.setLayoutManager(innerLLM);
innerRv.setRecycledViewPool(mSharedPool);
return new OuterAdapter.ViewHolder(innerRv);
}
TextView优化
- 原因:面对复杂文本性能不佳。
- BoringLayout 单行,Staticlayout 多行,
DynamicLayout 可编辑。
- 展示类StaticLayout即可,性能优于DynamicLayout。
- 异步创建StaticLayout。
- facebook/TextLayoutBuilder。
- TextView性能瓶颈,渲染优化,以及StaticLayout的一些用处
其他
参考: