一、文章快速总结RecycleView是安卓的列表,可以灵活控制每一项的数据,布局,动画。Adaper是整体适配器,逻辑放在这里。Holder是每一项的内容,把控件初始化放在这里。...事件监听,项中小组件就通过holder获取,整体点击的话通过mAdapter.setOnItemClickListener。ItemAnimator设置添加项和删除项的动画。...可以看到该适配器类主要有3个方法和1个自定义ViewHolder组成:onCreateViewHolder: 创建ViewHolder并返回,后续item布局里控件都是从ViewHolder中取出。...onBindViewHolder: 通过方法提供的ViewHolder,将数据绑定到ViewHolder中。getItemCount: 获取数据源总的条数。...当我们定义好接口后,我们在onBindViewHolder()方法中为holder.itemView(itemView是列表中的每一个item项)设置了点击事件监听,然后在onClick()中判断是否有用户传递过
结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...替换的目的一方面是可以提升对元数据的管理同时提升 GC 效率,另一方面是方便后续 HotSpot 与 JRockit 合并 在 1.9、1.10 版本中的主要特性是增加了模块系统,将 G1 设为默认垃圾回收器...1.11 版本是 Java 最新的长期支持版本,也将会是未来一段时间的主要版本,1.11 版本中提供的最激动人心的功能是 ZGC 这个新的垃圾回收器,ZGC 为大内存堆设计,有着非常强悍的性能,能够实现...考察点和加分项 面试考察点 从面试官角度出发,总结本课时对于计算机基础和 Java 语言特性的考察点如下。 第一考察点就是对基本概念和基本原理的考察。要求对这两项的理解必须是正确的,清晰的。...加分项 前面提到的考察点是面试通过的必要条件,回答出问题并不一定能保证通过面试,所以如何做到比其他竞争者更优秀,给面试官留下更好的印象,是成功的关键。你需要一些 buff。
如果持有对象的强引用,垃圾回收器是无法在内存中回收这个对象。 在Android开发中,最容易引发的内存泄漏问题的是Context。...如果这个方法执行完,在堆栈中仍存在持有该Activity的强引用,垃圾回收器就无法把它标记成已回收的内存,而我们本来目的就是要回收它! 结果就是Activity存活在它的生命周期之外。...因为static变量是贯穿这个应用的生命周期的,所以被泄漏的Activity就会一直存在于应用的进程中,不会被垃圾回收器回收。...当异步任务在后台执行耗时任务期间,Activity不幸被销毁了(译者注:用户退出,系统回收),这个被AsyncTask持有的Activity实例就不会被垃圾回收器回收,直到异步任务结束。...Sensor Manager 最后,通过Context.getSystemService(int name)可以获取系统服务。这些服务工作在各自的进程中,帮助应用处理后台任务,处理硬件交互。
在执行过程中,Java 虚拟机将获取调用者的实际类型,并在该实际类型的虚方法表中,根据索引值获得目标方法。这个过程便是动态绑定。...这个特有的适配器会将方法句柄作为常量,直接获取其 MemberName类型的字段,并继 续后面的 linkToStatic 调用。...每个类的构造器皆会直接或者 间接调用父类的构造器,并且在同一个实例中初始化相应的字段。 Object.clone 方法:直接复制已有的数据,来初始化新建对象的实例字段。...当需要新建对象时,内存管理模块便会从该空闲列表中寻找空闲内存,并划分给新建的对象。 清除这种回收方式的原理及其简单,但是有两个缺点。一是会造成内存碎片。...理 想情况下,Eden 区中的对象基本都死亡了,那么需要复制的数据将非常少,因此采用这种标记- 复制算法的效果极好。 Minor GC 的另外一个好处是不用对整个堆进行垃圾回收。
首先总结下RecyclerView的特点: 1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式 2.内部实现了回收机制,无需我们考虑...public ViewHolder(View itemView) { super(itemView); // 通常ViewHolder的构造,就是用于获取控件视图的...MyRecycleAdapter中,首先要写一个构造方法,因为有数据源,所有构造方法里必然有List private List strings; public MyRecycleAdapter...首先看一下以往我们对listview,gridview等等的删除某一项的操作 先在数据源中删除该位置的数据,然后刷新整个适配器,那么就可能会造成列表闪屏的问题,还有为了删除添加一个数据项而操作整个数据源的问题...ViewHolder(View itemView) { 127 super(itemView); 128 // 通常ViewHolder的构造,就是用于获取控件视图的
Adapter Adapter的使用方式前面已经介绍了,功能就是为RecyclerView提供数据,这里主要介绍万能适配器的实现。...中获取合适的View,在后文的回收机制中会介绍该方法的具体实现。...那么如何在不破坏原有Adapter实现的情况下完成呢? 这里引入装饰器(Decorator)设计模式,该设计模式通过组合的方式,在不破话原有类代码的情况下,对原有类的功能进行扩展。...中获取合适的View,如果获取到了,则直接返回,而不调用obtainView(),这也印证了如果从mActiveViews获取到了可复用的View,则不需要调用getView()。...position得到Item Type,然后根据Item Type从mScrapViews获取可复用的View,如果获取不到,则返回null,具体实现如下: RecyclerView回收机制 RecyclerView
但这之间如何通信呢,或者说网络请求结束,不管成功失败,如何告诉UI线程?这将在3.3.3 Handler消息处理中提到。...“工人”如何给Handler发一条消息?...,可以在目标Activity中,使用getIntent()获取传入的intent对象,利用该intent对象的getStringExtra()接受传入的String类型参数,当然也有其它类型的,此处不列举...3.3.5 回收型列表视图RecyclerView的使用 RecyclerView是基于viewholder的回收理念在ListView上的一个升级版,功能强大,当然在不需要进行回收的场景就当然不要用了...3.3.6 适配器理念Adapter 如上所说,列表视图需要一个中间件:适配器,来将数据适配到布局上,这是一个从结构化的数据到结构化的视图的中间过程,纵观整个项目开发,可以发现有很多地方在使用这样的理念
Adapter Adapter的使用方式前面已经介绍了,功能就是为RecyclerView提供数据,这里主要介绍万能适配器的实现。...其中next()调用了getViewForPosition(currentPosition),该方法是从RecyclerView的回收机制实现类Recycler中获取合适的View,在后文的回收机制中会介绍该方法的具体实现...那么如何在不破坏原有Adapter实现的情况下完成呢? 这里引入装饰器(Decorator)设计模式,该设计模式通过组合的方式,在不破话原有类代码的情况下,对原有类的功能进行扩展。...其中,getActiveView()是从mActiveViews中获取合适的View,如果获取到了,则直接返回,而不调用obtainView(),这也印证了如果从mActiveViews获取到了可复用的...obtainView()是从mScrapViews中获取合适的View,然后以参数形式传给了getView(),实现如下: ?
性能优化 1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 参考回答:首先我们要清楚图片的三级缓存是如何的: 如果内存足够时不回收。...内存判定对象可回收有两种机制: 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加 1;当引用失效时,计数器值就减 1;任何时刻计数器为 0 的对象就是不可能再被使用的。...BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个适配器!...结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...懒汉式中双层锁的目的是什么 ?两次判空的目的又是什么 ? 参考回答:单例模式实现方法有多种:饿汉,懒汉 (线程安全,线程非安全),双重检查 (DCL), 内部类,以及枚举。
参考回答:首先我们要清楚图片的三级缓存是如何的: ? 如果内存足够时不回收。内存不够时就回收软引用对象 2、内存中如果加载一张 500*500 的 png 高清图片。应该是占用多少的内存?...内存判定对象可回收有两种机制: 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加 1;当引用失效时,计数器值就减 1;任何时刻计数器为 0 的对象就是不可能再被使用的。...BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个适配器!...结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。...懒汉式中双层锁的目的是什么 ?两次判空的目的又是什么 ? 参考回答:单例模式实现方法有多种:饿汉,懒汉 (线程安全,线程非安全),双重检查 (DCL), 内部类,以及枚举。
内存泄漏的场景 在Android开发中,内存泄漏可能发生在如下几个场景: 1、查询操作后,没有关闭游标Cursor; 2、刷新适配器Adapter时,没有重用convertView对象; 3、...重用适配 APP往ListView或GridView中填充数据,都是通过适配器BaseAdapter的getView方法展示列表元素。...当列表元素多次处于“展示->隐藏->展示->隐藏……”时,就有必要重用每个元素的视图,如果不重用,那么每次展示可视元素都得重新分配视图对象(从系统服务LAYOUT_INFLATER_SERVICE获取)...注销监听 Android中有许多监听器,不过注册到系统服务中的监听器并不多,TelephonyManager可算是其中一个(其对象来自于系统服务TELEPHONY_SERVICE)。...下面是预防此类内存泄漏的三个方法: 1、如果异步任务是由Handler对象的postDelayed方法发起,那么可用对应的removeCallbacks方法回收之,把消息对象从消息队列移除就行了。
= null) { // 新的适配器注册数据监听器 adapter.registerAdapterDataObserver(this.mObserver);...,当适配器中的数据发生增删改的时候最终会调用该接口的实现类,从该接口的命名以及注册操作和取消注册操作可以看出其使用的是观察者模式。...itemView 就是我们要获取的子视图,ViewHolder 是如何获取的呢?...2.2 回收 ViewHolder ViewHolder 回收的场景有很多种,比如说滑动、数据删除等等。...除了适配器模式之外,Adapter 中还使用观察者模式,这一点可以从 RecyclerView#setAdapter 方法中可以看出,设置适配器的时候,会对旧的 Adapter 取消注册监听器,接着对新的
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。...、长按监听器itemLongClickListener等等,故而完全可以把这些通用部分提取到一个基类,然后具体业务再从该基类派生出特定的业务适配器类。...其中的缘由是Anko库仅仅实现了Activity活动页面的控件自动获取,并未实现适配器内部的自动获取。...这下不管是在Activity代码,还是在适配器代码中,均可将控件名称拿来直接调用了。...这么神奇的魔法,快来看看Kotlin的适配器代码是如何书写的: //利用Kotlin的插件LayoutContainer,在适配器中直接使用控件对象,而无需对其进行显式声明 class RecyclerStaggeredAdapter
GC算法 GC 就是垃圾回收机制的简写 GC可以找到内存中的垃圾、并释放和回收空间 GC里的垃圾是什么 程序中不再需要使用的对象 程序中不能再访问到的对象 什么是GC算法 GC是一种机制,垃圾回收器完成具体的工作...那么V8如何回收老生代呢?...老生代区域垃圾回收不适合复制算法 关于增量标记算法如何优化垃圾回收?...堆快照查找分离DOM 界面元素存活在DOM树上 垃圾对象时的DOM节点(从DOM树上脱离,在JS代码中也没有引用) 分离状态的DOM节点(从DOM树上脱离,在JS代码中存在引用,那么这样是有问题的占用内存...判断是否存在频繁GC GC工作时应用程序是停止的 频繁且过长的GC会导致应用致死 用户使用中感知应用卡顿 确定频繁垃圾回收 Timeline中频繁的内存上升下降 任务管理器中数据频繁的增加减小 瞬间增大瞬间减小这样的表象就会频繁垃圾回收
编译代码时,编译器可以检查原始数据类型,并提前计算它们所需内存。然后将所需的数量分配给调用堆栈中的程序。...你的代码永远不必依赖于此时基本数据类型的大小。 编译器将插入与操作系统交互的代码,以便在堆栈中请求要存储的变量所需的字节数。 上述示例中,编译器知道每个变量的确切内存地址。...它保存所有的局部变量,还有一个程序计数器,可以记录函数的执行位置。当函数执行完成时,其内存块可以再次用于其他目的。...Cycles are not a problem anymore 在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。...= "some text"; } 假设 bar 的目的是仅引用 foo 函数中的变量。
编译代码时,编译器可以检查原始数据类型,并提前计算它们所需内存。然后将所需的数量分配给调用堆栈中的程序。...你的代码永远不必依赖于此时基本数据类型的大小。 编译器将插入与操作系统交互的代码,以便在堆栈中请求要存储的变量所需的字节数。 上述示例中,编译器知道每个变量的确切内存地址。...它保存所有的局部变量,还有一个程序计数器,可以记录函数的执行位置。当函数执行完成时,其内存块可以再次用于其他目的。...Cycles are not a problem anymore 在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。 ?...= "some text"; } 假设 bar 的目的是仅引用 foo 函数中的变量。
下面准备进入正题,HorizontalScrollView不管里面多少View都是不会回收的,当达到一定量的时候会发生OOM,下面介绍如何改写HorizontalScollView实现文章开始所说的效果...mHorizontalScrollView.initDatas(mAdapter); } } 用起来是不是有点像ListView,初始化数据适配器,然后设置数据适配器,然后就是设置各种回调...* 当前第一张图片的下标 */ private int mFristIndex; /** * 当前第一个View */ private View mFirstView; /** * 数据适配器...,并且设置onclick事件,且加入容器中 View view = mAdapter.getView(++mCurrentIndex, null, mContainer); view.setOnClickListener...= mAdapter; mContainer = (LinearLayout) getChildAt(0); // 获得适配器中第一个View final View view = mAdapter.getView
服务的动态代理 责任链模式:Netty消息处理的方式 适配器模式:Slf4J如何支持Log4J 观察者模式:GRPC是如何支持流式请求的 构造者模式:PB序列化中的Builder 2.4 Java基础知识详解...GC 分代回收 老年代 年轻代 持久代 回收器实现 穿行回收器 并行回收器 CMS G1 性能调优 JVM参数 性能分析工具 MAT JMC JStack JStat 执行模式 解释模式 编译模式 混合模式...在多线程进行数据交互时,例如线程A给一个共享变量赋值后由线程B来读取这个值,线程A修改变量只修改在自己的工作内存区中,线程B是不可见的,只有从A的工作内存区写回到工作主内存,B在从主内存读取到自己的工作内存区才能进行进一步的操作...(简单描述编译器的指令重排) 简单描述一下volatile可以解决什么问题?如何做到的? 强制主内存读写同步以及防止指令重排序两点 简单描述一下GC的分代回收 G1垃圾回收算法与CMS的区别有哪些?...或找出)两个数组中重复的数字 将一颗二叉树转换成其镜像 确定一个字符串中的括号是否匹配 给定一个开始词,一个结束词,一个字典,如何找到从开始词到结束词的最短单词接龙路径 如何查找两个二叉树节点的最近公共祖先
适配器模式: 将已有的数据转换成需要的数据。适配器模式将原本不兼容而不能一起工作的类变的可以一起工作。...SpringMvc中的处理器适配器就是一种适配器模式,将传入的不同数据转换为ModelAndView。 HTTP和HTTPS协议的区别 HTTP是普通的传输协议,端口号是80,信息是明文传输。...内存中的栈(stack)、堆(heap)和方法区(method area)的用法 通常定义的基本数据类型的变量,对象的引用都保存在栈内存中,通过new关键字和构造器创建的对象保存在堆内存中。...,Java提供的GC功能可以自动检测对象是否超过作用域从而达到回收内存的目的,Java语言没有提供释放已分配内存的操作方法,垃圾收集器会自动进行管理。...垃圾回收可以有效的防止内存泄漏,有效的使用内存,垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对堆内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
领取专属 10元无门槛券
手把手带您无忧上云