Jack Lee
Jack Lee
recyclerView算是Android中比较常用的控件了,平常的使用也很简单,没什么说的。 另外,recyclerView也经常会有嵌套使用和多条目布局的使用方法,嵌套使用时要注意处理是否有滑动冲突,多条目布局就是定义多个ViewHolder来区分不同的条目。 另外使用itemDecoration可以灵活控制布局之间的间距和装饰等效果。 缓存机制的话确实还没读过源码,找了篇技术文章,可以参考下:https://blog.csdn.net/wzy_1988/article/details/81569156
大佬们都回答的差不多了,我也简单说一下吧。 AsyncTask主要是用来处理子线程和UI线程互相切换的情景。于执行耗时任务而言,它是执行在子线程中的(内部由一个线程池维护);于多个任务之间的,添加到任务队列而言,如果是直接执行execute方法,它则是同步的,就是说,每一个任务的执行,都必须等上一个任务完成。 当然,你也可以执行executeOnExecutor来接管从入队到到执行所有的实现,让他变成一个可以异步添加,并且异步执行的AsyncTask。 (未完待续...)
hadler的实现其实是个很复杂的问题(对我这个小白来说),不仅涉及到java相关的实现,Android为了保证消息机制在底层也可以使用,相关实现其实是放在native当中的,java层中的Looper对象持有一个nativeMessageQueue的指针引用mPtr,通过这个指针来调用native层的方法。 从设计的角度考虑,Android应该是“消息驱动”的,也就是主线程的UI更新都是依赖于消息的收发的。要实现“消息驱动”,首先要有一个消息队列来对消息进行维护,其次要对消息进行初始化和消息循环。 具体到Android实现当中,消息循环是用Looper来维护的,主线程的Looper对象是其他线程共享的,其他线程的Looper都存在各自的线程本地变量(ThreadLocal)当中;Lopper中持有的MessageQueue对象是消息队列的具体实现,Looper.loop()方法会对消息队列进行循环读取,MessageQueue.next方法会从消息队列中循环取消息(这个操作是用加锁的方式来实现的线程安全),此时消息创建和消息循环的流程就都有了。 还剩最后一部分就是消息发送。现在我们可以在主线程中,用mainLooper来循环读取消息,那其他线程也还需要往这个消息队列中插入消息。Android中的消息发送是用Handler来实现的。Handler负责为发送消息和接收提供接口。这一块还没有深入了解,待补充。
# 先来说说OOM(内存溢出) 说到OOM(内存溢出)就不得不提jvm的内存区域划分了。 JVM中把内存划分为以下几个区域: * gc堆 * 方法区 * jvm栈 * 本地方法栈 * pc寄存器 还有一个特殊的区域,`直接内存`,这块区域是不属于jvm管理的,是由java中的directByteBuffer持 有该区域的指针对其进行操作。 其中gc堆是内存的主要管理区域,一般发生OOM也是在这块区域中。 这块区域中的OOM主要是因为,申请总内存超过分配给进程内存大小导致的 然后再来说下jvm栈,该区域也会引发OOM异常,该区域的异常分为两种情况: 1. 无法申请到足够的内存空间时(如单次申请的连续内存空间不足),会导致OOM异常 2. 线程请求的栈深超过设置的栈深度时,会触发stackOverflow异常 另外方法区(又被成为永久带,PerGen)也可能会出现OOM异常(OutOMemoryError:PerGen space) 方法区具体包括,常量池和运行时常量池,用来存储类信息,常量,静态变量等,和GC堆都属于线程共享的内存区域。当动态创建大量的类,或存储过多的常量时,就有可能导致OOM异常 另外直接内存虽然不受JVM内存管理,但是当其申请的总大小超过真实的物理内存时,仍然会引发OOM异常,这也是OOM的原因之一。 # 再来说说内存泄漏 内存泄漏涉及到了jvm中的对象自动回收技术(GC),这一块研究的还不深,过一段时间再来总结...