Giter VIP home page Giter VIP logo

Comments (16)

yangfanggang avatar yangfanggang commented on May 23, 2024 23

我每天看完题的表情和我头像一样

from android-daily-interview.

18361237136 avatar 18361237136 commented on May 23, 2024 22

看了别人家的解答之前:我好像没有优化过,就这样用
看了别人家的解答之后:分页加载,不要重复newAdapter,点击事件设置在ViewHolder中

from android-daily-interview.

ADrunkenLiBai avatar ADrunkenLiBai commented on May 23, 2024 12

RecyclerView作为android的重要View,有很大的灵活性,可以替代ListView GridView ScrollView,所以需要深入了解一下Rv的性能以及如何去处理优化,实现更加流畅体验,这点是毋庸置疑的,所谓的RV优化其实也是对适配器以及刷新数据的,还有资源复用的优化,下面是本人对RV的一点点优化处理:

1 onBindViewHolder
这个方法含义应该都知道是绑定数据,并且是在UI线程,所以要尽量在这个方法中少做一些业务处理
2 数据优化
采用android Support 包下的DIffUtil集合工具类结合RV分页加载会更加友好,节省性能
3item优化
减少item的View的层级,(pps:当然推荐把一个item自定义成一个View,如果有能力的话),如果item的高度固定的话可以设置setHasFixedSize(true),避免requestLayout浪费资源
4 使用RecycledViewPool
RecycledViewPool是对item进行缓存的,item相同的不同RV可以才使用这种方式进行性能提升
5 Prefetch预取
这是在RV25.1.0及以上添加的新功能,预取详情
6 资源回收
通过重写RecyclerView.onViewRecycled(holder)来合理的回收资源。

看楼上说的挺好的,但是人家好谦虚,我也得谦虚点,说的很简单和片面,不喜勿喷!

from android-daily-interview.

shanghai-hujin avatar shanghai-hujin commented on May 23, 2024 9

1,减少view type的种类,如果样式差别不大,可以公用一个布局。因为inflate调用比公用布局的绘制占用更多的性能。
2,可以使用DiffUtil去刷新数据,notifyDataSetChanged性能太低而且不会出发增删动画。(子线程计算新旧数据,主线程刷新recylerView)
3,分页加载
4,有大量图片时,滚动停止加载图片,停止才通知adapter去加载
5,设置合理的RecycledViewPool
说的都很简单和片面....勿喷

from android-daily-interview.

zizikoth avatar zizikoth commented on May 23, 2024 9

RecyclerView优化 一句话思路 空间换取时间 使用内存空间来换取数据转化的时间
1.在Adapter中最好不要进行任何的逻辑操作,比如日期转换,字符串切割等等,可以在model内部自行添加一个参数使用
by lazy 来存储数据转换后的结果,这样数据逻辑操作就只执行一次,而不会随着数据回收重复计算
2.新增删除数据不刷线全部,而是刷新局部
3.布局优化,尽量少的布局嵌套,尽量少的控件
4.对于一些RecyclerView嵌套RecyclerView的布局可以进行多布局展示,而不是使用嵌套
5.资源文件的读取,初始化的时候使用 by lazy 生成
6.如果RecyclerView条目高度固定,使用setHasFixedSize(true),避免多次测量条目高度
7.对于RecyclerView,如果不需要动画,就把条目显示动画取消setSupportsChangeAnimations(false)
8.在RecyclerView添加滑动监听,一些图片加载可以在RecyclerView快速滑动的时候不进行加载图片
9.对于一个页面中的多个RecyclerView,如果使用同一个Adapter,可以使用setRecycledViewPool(pool),共用回收池,
避免来每一个RecyclerView都创建一个回收池,特别是RecyclerView嵌套RecyclerView时候,
内部的RecyclerView必定使用的都是同一个Adapter,这个时候就很有必要使用回收池了
10.视情况使用setItemViewCacheSize(size)来加大RecyclerView缓存数目,用空间换取时间提高流畅度
11.对于条目点击时间不要在复用部分进行setOnClickListener,这样会重复设置点击监听,而是应该创建一个listener对象,
传入控件的id,和当前的条目position,通过id和position判断处理点击监听
12.可以进行预加载,重写LayoutManager的getExtraLayoutSpace()方法,可以返回屏幕高度,预先加载一屏幕高度的数据,
视情况,例如:一个item就占据一个页面,RecyclerView滑动到第二张,此时第一张可见,RecyclerView无法找到可复用
的View,此时会重新new一个出来,滑动卡顿,第三张及以后可以找到复用的View,滑动流畅

from android-daily-interview.

kakarottoll avatar kakarottoll commented on May 23, 2024 4
  1. 减少item布局层次
  2. 在ViewHolder中设置点击事件而不是在onBindViewHolder
  3. 合理使用setRecycledViewPool
  4. item的高度固定时setHasFixedSize(true)
  5. 两个数据源大部分相似时使用swapAdapter代替setAdapter
  6. 不要什么情况都用adapter.notifyDataSetChanged(),小范围修改可以试试adapter.notifyItemChanged(position)或者adapter.notifyItemRangeChanged(positionStart,itemcount)

from android-daily-interview.

chenqi5256969 avatar chenqi5256969 commented on May 23, 2024 3

1.利用DiffUtil对数据进行刷新。
2.减少布局的层级。
3.如果Item的高度一致,可以设置setHasFixedSize(true),这个方法的意义就是当调用onItemRangeChanged(),

onItemRangeInserted(),

onItemRangeRemoved(),

onItemRangeMoved()这几个方法时,可以避免重复的requestLayout,节省资源
4.滚动状态停止加载图片,只有当处于停止状态才去加载图片。
5.如果不要求动画,可以通过 ((SimpleItemAnimator) rv.getItemAnimator()).setSupportsChangeAnimations(false); 把默认动画关闭来提神效率.
6.对 TextView 使用 StaticLayout的自定义 View 来代替它,因为在TextView的内部也是靠StaticLayout来实现的

from android-daily-interview.

fewwind avatar fewwind commented on May 23, 2024 3

@kakarottoll 为什么不能把点击事件设置在onBindViewHolder,设置在onBindViewHolder中会带来什么影响?

onBind会多次调用导致new多个listener

from android-daily-interview.

manondidi avatar manondidi commented on May 23, 2024 1

1.监听onscrolllistener 把一部分的图片加载和 视频控件出事化到 停止滚动的时候采取加载
2.在feed流中使用viewstub, 把一部分不是每次都要初始化的view 延迟初始化
3.使用 x2c 工具 把原本是xml 构造的界面 转为代码生成 减少 读取xml的 ios操作
4.设置viewCacheSize 使得短距离内快速滑动,复用item,不用走createView和 binderView,避免卡顿
5.设置recyclerPool, 使得 一个Activity中多个相似的recyclerView, 或者水平嵌套垂直的 recyclerView可以复用
6.不在onbindview里面做数据操作 而是获取网络的时候就把model中的复杂数据处理成简单地viewmodel,直接设置进去就能用了
7.使用空闲线程 去预先初始化一部分 view
8.如果可以 预先设置好 item的高度, 并在recyclerView中设置一个方法setHasFixedSize, 可以不必每次都计算recyclerView的告诉
9.diff 数据 局部刷新
10.如果可以减少 type种类,可以提高复用率

from android-daily-interview.

Alex-Cin avatar Alex-Cin commented on May 23, 2024

楼上几位回答的, 我觉得很好, 讲一下, 我遇到的另一个面试题
你怎么实现 多种布局? 答案是 viewType;
怎么解决 onCreateHolder 里面的 if else 问题? 用 switch? 不是一样吗?
用 hashMap, 先存再获取? 嗯, 还不错, 是一种思路;
还有没有别的?
用反射. 嗯, 可以可以, 怎么解决 耗时问题? 构造器存缓存起来. 嗯, 可以;
还有没有别的办法了?
暂时想不起来了;
有知道的, 可以交流一下...

from android-daily-interview.

susyimes avatar susyimes commented on May 23, 2024
  1. arraymap 比 hashmap更适合作为 多种类viewholder 类型判断替代。
  2. airbnb的epoxy推荐给大家。

from android-daily-interview.

Chen-keeplearn avatar Chen-keeplearn commented on May 23, 2024

@kakarottoll 为什么不能把点击事件设置在onBindViewHolder,设置在onBindViewHolder中会带来什么影响?

from android-daily-interview.

gmlymayday avatar gmlymayday commented on May 23, 2024

楼上几位回答的, 我觉得很好, 讲一下, 我遇到的另一个面试题
你怎么实现 多种布局? 答案是 viewType;
怎么解决 onCreateHolder 里面的 if else 问题? 用 switch? 不是一样吗?
用 hashMap, 先存再获取? 嗯, 还不错, 是一种思路;
还有没有别的?
用反射. 嗯, 可以可以, 怎么解决 耗时问题? 构造器存缓存起来. 嗯, 可以;
还有没有别的办法了?
暂时想不起来了;
有知道的, 可以交流一下...

我司用的map存储 通过反射来做的holder组件库 可以交流下

from android-daily-interview.

zhouyueyuedsf avatar zhouyueyuedsf commented on May 23, 2024

@kakarottoll 为什么不能把点击事件设置在onBindViewHolder,设置在onBindViewHolder中会带来什么影响?

onBind会多次调用导致new多个listener

但如果删除了一个item,需要重新确定holder的位置,listener中对holder有引用,这该咋弄

from android-daily-interview.

fff4 avatar fff4 commented on May 23, 2024

我一般通过调用三方框架来优化

from android-daily-interview.

mlinqirong avatar mlinqirong commented on May 23, 2024

1,viewType不要多套布局 布局中减少嵌套
2,当我们确定item的改变不会影响RecyclerView的宽高的时候可以设置setHasStableIds(true)
3,onBindViewHolder中尽量少做一些业务逻辑处理
4,不要在什么情况下都使用notifyDataSetChanged刷新 小范围刷新用onItemRangeChanged onItemRangeInserted onItemRangeRemoved
5,分页加载

from android-daily-interview.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.