缓存机制:ListView有两级缓存,但RecyclerView有四级缓存,缓存效率更高。...参考简答: RecyclerView通过一系列精细的缓存机制优化性能,包括: AttachedScrap 作用:存储暂时从RecyclerView中分离,但很快会重新绑定和重新使用的ViewHolders...与AttachedScrap不同,这些ViewHolders已经从RecyclerView中彻底分离,但是它们的数量有限制,默认是2个。...正确使用局部更新方法:在数据集更改后,确保调用适当的notifyItemChanged()等方法来通知Adapter数据已更改。...这减少了RecyclerView的重新布局次数,优化了性能。 利用DiffUtil计算数据差异:使用DiffUtil类来计算新旧数据集的最小差异,并根据这些差异来更新RecyclerView。
2、recyclerkView源码解析首先看recyclerView的注释图片adapter:正如前文所诉,RecyclerView.Adapter 负责提供表示数据集中项目的视图。...Scrap(view):在布局时进入暂时分离状态的子视图。...可以在不完全脱离父 RecyclerView 的情况下重用 Scrap 视图,如果不需要重新绑定则不修改,或者如果视图被认为是脏的则由适配器修改。...数据重置,需要重新绑定数据detach操作,是一种轻量级的分离,只会把这个View在ViewGroup的children数组中的引用设为null,并设置他的parent为null。...当一个视图被分离时,它的父级为 null 并且不能通过调用getChildAt(int)来检索。
不过,当 Activity 正在运行(处于已恢复生命周期状态)时,可以独立操纵每个片段,如添加或移除片段。...inflater.inflate(R.layout.example_fragment, container, false); } } 传递至 onCreateView() 的 container 参数是片段布局将插入到的父级...将作为扩展布局父项的 ViewGroup。传递 container 对系统向扩展布局的根视图(由其所属的父视图指定)应用布局参数具有重要意义。...已暂停:另一个 Activity 位于前台并具有焦点,但此片段所在的 Activity 仍然可见(前台 Activity 部分透明,或未覆盖整个屏幕)。 已停止:片段不可见。...如果尚未附加该片段,或者其在生命周期结束期间已分离,则 getContext() 返回 null。 Fragment相关面试题: 1.
我们可以使用这些空闲时间来完成将来的工作,并使得未来的帧出现得更快, 如果使用 RecyclerView 提供的LayoutManager,自动使用了这种优化操作。...什么时候LayoutManager会从RecyclerView上分离呢,有两种情况:1)重新setLayoutManager()时,比如淘宝页面查看商品列表,可以线性查看,也可以表格形式查看,2)还有一种是...RecyclerView从视图树上被remove时。...移出屏幕的ViewHolder会先进入第一级缓存ViewCache中,当第一级缓存空间已满时,会考虑将一级缓存中已有的ViewHolder移到RecyclerViewPool中去。...10.2 由于RecyclerView关联的GapWorker导致内存泄漏 RecyclerView导致内存泄漏问题分析,其实主要是RecyclerView关联的GapWorker中有一个静态的ThreadLocal
mAttachedScrap:只保存重新布局时从RecyclerView分离的item的无效、未移除、未更新的holder。...CacheView缓存:mCachedViews又称离屏缓存,用于保存最新被移除(remove)的ViewHolder,已经和RecyclerView分离的视图,这一级的缓存是有容量限制的,默认最大数量为...(2)如果是RecyclerView滚动情况下缓存(比如滑动列表),在滑动时填充布局。 先移除滑出屏幕的item,第一级缓存mCachedViews优先缓存这些ViewHolder。...缓存池被称为二级缓存。...2.数据处理与视图绑定分离,去除onBindViewHolder方法里面的耗时操作,只做纯粹的数据绑定操作。
使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。...从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。...内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光 内存泄露原因: 一、Handler 引起的内存泄漏...解决:把内部类修改为静态的就可以避免内存泄漏了 四、非静态匿名内部类引起的内存泄漏。 解决:将匿名内部类设置为静态的。 五、注册/反注册未成对使用引起的内存泄漏。...RecyclerView提供了API来实现item的动画效果。 在性能上: 如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。
一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。...同样的道理,当加载的数据为空时显示一个数据为空的视图、在数据加载失败时显示加载失败对应的UI并支持点击重试会比白屏的用户体验更好一些。...id对应的控件中 在BaseActivity/BaseFragment的子类中可通过上一步的封装比较方便地使用加载状态显示功能 这种封装的好处是通过封装动态地创建LoadingView并添加到指定的父容器中...等,它们都是通过Adapter来解耦的,将自身的逻辑与需要动态变化的子View进行分离。...)页面中可指定LoadingView的显示区域 (已实现)支持在Fragment中使用 另外,还顺带支持在RecyclerView、ListView、GridView、ViewPager等情况下的使用
逐行解析 XML 文件,创建相应的视图对象,并设置视图对象的属性。 将所有视图对象组织成一个视图层次结构。 在解析布局文件时,Android 系统会使用反射机制来动态地创建视图对象。...可以使用 include 标签来分离重复的代码,并提高布局文件的复用性。在使用 include 标签的同时,还可以使用 android:visibility 属性来指定布局的显示和隐藏。...使用 RecyclerView 来优化列表布局。 在应用程序中,列表布局是最常用的视图之一。...与传统的 ListView 和 GridView 相比,RecyclerView 具有更好的性能、更高的灵活性和更好的交互效果。...时,还可以使用 RecyclerView.Adapter 和 RecyclerView.ViewHolder 来实现数据和视图之间的绑定,从而更好地管理和展示列表数据。
二、单例模式引起的内存泄漏。 三、非静态内部类创建静态实例引起的内存泄漏。 四、非静态匿名内部类引起的内存泄漏。 五、注册/反注册未成对使用引起的内存泄漏。 六、资源对象没有关闭引起的内存泄漏。...使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。...内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光 内存泄露原因: 一、Handler 引起的内存泄漏...避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。...2、重写:子类继承父类,则子类可以通过实现父类中的方法,从而新的方法把父类旧的方法覆盖。 6、Http https区别 https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
京东首页 这是京东的首页,忽略顶部和顶部,大致理解视图结构就是:最外层为多布局的RecyclerView,最后一个item是tabLayout+ViewPager,ViewPager的每个fragment...是否接受嵌套滑动 * * @param child 嵌套滑动对应的父类的子类(因为嵌套滑动对于的父View不一定是一级就能找到的,可能挑了两级父View的父View...,大于想要滚动的距离,内层自行处理 }else { //内层已滚动的距离,小于想要滚动的距离,那么内层消费一部分,到顶后,剩的外层滑动...NestedScrollingParent2Layout是继承自 LinearLayout implements 并实现了NestedScrollingParent2,主要处理了通用的方法实现。...是否接受嵌套滑动 * * @param child 嵌套滑动对应的父类的子类(因为嵌套滑动对于的父View不一定是一级就能找到的,可能挑了两级父View的父View
ListView vs RecyclerView ListView相比RecyclerView,有一些优点: addHeaderView(), addFooterView()添加头视图和尾视图。...isRunning(): 是否有动画要执行或正在执行。 dispatchAnimationsFinished(): 当全部动画执行完毕时被调用。...这个问题的描述是:当Item视图中有图片和文字,当更新文字并调用notifyItemChanged()时,文字改变的同时图片会闪一下。...Recycler是RecyclerView回收机制的实现类,他实现了四级缓存: mAttachedScrap: 缓存在屏幕上的ViewHolder。...回顾 回顾整篇文章,发现我们已经实现了RecyclerView的很多扩展功能,包括:打造万能适配器、添加Item事件、添加头视图和尾视图、设置空布局、侧滑拖拽。
指令具有相同的生命周期挂钩集,减去特定于组件内容和视图的挂钩。 组件生命周期挂钩 指令和组件实例的生命周期与Angular创建,更新和摧毁它们一样。...取消订阅observables并分离事件处理程序以避免内存泄漏。 在Angular摧毁指令/组件之前调用。 其他生命周期挂钩 其他Angular子系统除了这些组件钩子可能有自己的生命周期钩子。...这个偷偷摸摸的间谍指令很简单,几乎完全由ngOnInit和ngOnDestroy钩子组成,这些钩子通过注入的LoggerService将消息记录到父级。...这个钩子迭代已更改的属性并记录它们。 示例组件OnChangesComponent具有两个输入属性:hero和power。...在这种情况下,投影内容是来自父级的。 ? 内容投影的指示标记是(a)组件元素标签之间的HTML和(b)组件模板中存在标签。
onInterceptTouchEvent:方法返回值为true,表示拦截这个事件并交由自身的onTouchEvent方法进行消费;返回false表示不拦截,需要继续传递给子视图。...onTouchEvent:方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...如果在父View中拦截ACTION_UP或ACTION_MOVE,在第一次父视图拦截消息的瞬间,父视图指定子视图不接受后续消息了,同时子视图会收到ACTION_CANCEL事件。...如果有以下的情形,那么它就是前台进程: 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法) 托管某个 Service,后者绑定到用户正在交互的 Activity...托管正在“前台”运行的 Service(服务已调用 startForeground()) 托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy
性能优化 1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 参考回答:首先我们要清楚图片的三级缓存是如何的: 如果内存足够时不回收。...内存泄露 (memory leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。...查找内存泄漏可以使用 Android Studio 自带的 AndroidProfiler 工具或 MAT 7、性能优化,怎么保证应用启动不卡顿?黑白屏怎么处理?...中可以实现局部刷新,例如:notifyItemChanged (); 缓存区别: RecyclerView 比 ListView 多两级缓存,支持多个离 ItemView 缓存,支持开发者自定义缓存处理逻辑...android 中无法做到彻底分离,但在代码逻辑层面一定要分清业务逻辑被放置在 model 层,能够更好的复用和修改增加业务。
内存泄露 (memory leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。...查找内存泄漏可以使用 Android Studio 自带的 AndroidProfiler 工具或 MAT 7、性能优化,怎么保证应用启动不卡顿?黑白屏怎么处理?...中可以实现局部刷新,例如:notifyItemChanged (); 缓存区别: RecyclerView 比 ListView 多两级缓存,支持多个离 ItemView 缓存,支持开发者自定义缓存处理逻辑...本来主要是作为初始化页面,展示数据的操作,但是因为 XML 视图功能太弱,所以 Activity 既要负责视图的显示又要加入控制逻辑,承担的功能过多。...android 中无法做到彻底分离,但在代码逻辑层面一定要分清业务逻辑被放置在 model 层,能够更好的复用和修改增加业务。
Android 视图 回调 Android 视图系统中尤其热衷于使用回调: 目前在 Android Framework 中,view 和 widgets 类中的回调有 80+ 个,在 Jetpack...举个例子: Fragment 返回出栈,通过处理取消事件,我们可以取消异步操作,并清除相关引用的资源。 #2: 在协程被挂起的时候,异步 UI 操作被取消或者抛出异常。...并不是所有的操作都有已取消或出错的状态,但是这些操作有。就像后面 Animator 的示例中那样,我们必须把这些状态传递到协程中,让调用者可以处理错误的状态。...并其向上平移,然后执行向下的动画 titleView.isVisible = true titleView.translationY = -titleView.height.toFloat...为了避免发生内存泄漏,在我们操作 UI 的时候,选择合适的作用域来运行协程是极其重要的。幸运的是,我们的 View 有一些范围合适的 Lifecycle。
本篇文章已授权微信公众号 code小生 发布 转载请表明出处: http://www.jianshu.com/p/4176c1247eed 前情提要 ?.../a); 51%->75%: (c/a)->(b/a); 76%->100%: (b/a)->1.0; Item动画代码实现 新建一个CustomAnimation类,定义相应动画控件的id,并初始化...: // 无控件 private static final int NO_VIEW = -999; // 透明度变化视图 private int mAlphaViewId = NO_VIEW; // 图片变化视图...setMarginViewId(int resId) { Log.i("animm", "setMarginViewId"); mMarginViewId = resId; } 定义变量process,并通过传入...process的值进行效果实现: // 动画进度 private int mProcess = 0; /** * 通过进度值控制动画的进度 * @param viewGroup 父容器 * @param
应聘者:当 UI 停止响应超过5秒以上时,通常会因为已阻塞主线程而出现 ANR 对话框。为避免遇到ANR错误,应将尽可能多的任务移出主线程。...RecyclerView 在显示较长的项目列表。假设我们要显示100行项目。一种简单的方法是只创建100个视图,每行一个视图,然后将它们全部布局。...因此, RecyclerView 只创建屏幕上的10个左右的视图。这样,速度和内存使用率将提高10倍。但是,当开始滚动并需要开始显示下一个视图时会发生什么?...代替为每个新行创建新视图,而是通过将新数据绑定到旧视图来对其进行回收和重用! 应聘者:我学到了! 18、面试官:再说一下RecyclerView与ListView有何不同?...RecyclerView 将列表与其容器分离,因此可以通过设置LayoutManager在运行时轻松地将列表项放在不同的容器(linearLayout,gridLayout)中。
领取专属 10元无门槛券
手把手带您无忧上云