Morse

Results 5 comments of Morse

你是什么问题,贴一下问题看看

RecyclerView内部缓存机制是四级缓存:Scrap、Cache、ViewCacheExtension、RecycledViewPool,RecyclerView是通过LayoutManager里面的Recycler来管理缓存; 1、Scrap:屏幕内部的ItemView,通过数据集的position来找到对应的Item,可以直接取过来用; 2、Cache:刚移出屏幕的ItemView,放到Cache里,当Cache里的ItemView重新进入屏幕时,也是通 过position来找到对应的Item,直接可以使用,不需要走bindViewHolder()。Cache和 Scrap 一样,都是可以直接通过position来找到对应的Item,不需要重新绑定; 3、ViewCacheExtension:自定义缓存,如果有自定义,需要在这里面找,没有的话直接跳过; 4、RecycledViewPool:所有被废弃的ItemView的Pool,该pool里面的Item都是dirty的,需要通过 ViewType来找到数据,找到数据的话,需要重新绑定,不走createViewHodler(),走bindViewHolder()。

大佬们说了很多,我加一点: 任何时候调用cancel(boolean)方法,都可以取消任务。这个方法会产生的影响是:之后调用的iscancelled()会返回true。 这个方法调用之后,onCancelled(Object)方法会在doInBackground(Object[]) 方法返回后执行,而不是onProgressUpdate(Progress... values)方法 鉴于上述据说,为了确保任务是尽快取消,你应该定期在doInBackground()方法中始终检查iscancelled()方法的返回值。如果可以的话,放在一个循环当中。

Handler用于封装消息的发送,先介绍与Handler相关的几个元素: 一、Message:消息,Handler接收和处理的消息对象; 二、Looper:一个消息轮询机制,每个线程只能拥有一个Looper.它的loop方法负责读取MessageQueue中的消息,读到消息之后就把消息发送该消息的Handler处理. 三、MessageQueue:消息队列. Handler内部会跟Looper进行关联,也就是说在Handler内部可以找到Looper,找到Looper也就找到了MessageQueue,在handler中发送消息,就是向MessageQueue队列中发送消息. 下面讲一下具体细节: 默认整个应用程序都是通过ActivityThread创建,在ActivityThread中创建Activity,默认创建main线程,在线程中默认创建Looper;在Activity的main方法中,调用Looper.prepareMainLooper(), 在prepareMainLooper()中调用prepared(),调用ThreadLocal.set(new Looper()), 传入了一个Looper对象, 在new Looper()这个构造方法中, 先new 出一个MessageQueue(), 并将当前执行的线程对象赋值给Handler的Thread对象. ![无标题](https://user-images.githubusercontent.com/16618262/62875259-4f311f80-bd55-11e9-95a9-64f1266d65bb.png) Handler和Looper的MessageQueue关联: 通过刚才的代码, 在Handler中调用Looper.myLooper(), 通过ThreadLocal.get(), 拿到Looper对象, 再通过该对象拿到MessageQueue. 通过for循环轮询队列, 找到消息的话, 通过msg.target.dispatchmessage(msg), 也就是Handler.dispatchMessage方法, 该方法首先会调用callback的handleMessage(), 如果这个方法执行返回true, 则代表该callback消费了该消息事件, Handler的handleMessage()将不会执行....

内存溢出:OOM(OutOfMemory),指的是程序所需内存超出了虚拟机所分配的最大内存范围,除了程序计数器以外,虚拟机内存的其他几个运行时区域都有可能发生OOM。 1、Java堆溢出:程序创建了过多对象,超过了最大堆的容量,且没被GC回收,则会发生对溢出; 2、虚拟机栈和本地方法栈溢出:如果线程请求的最大栈深度超过了虚拟机所允许的最大栈深度,则会抛出StackOverflow异常;如果虚拟机在扩展栈时无法申请到足够的内存空间,则会抛出OutOfMemory异常; 3、方法区和运行时常量池溢出 :运行时常量池是方法区的一部分。方法区用于存放Class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。这一点溢出原因还未弄懂; 内存泄漏:指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。Java内存泄漏的根本原因是长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收。主要有以下几种情况: 1、集合里面的对象属性被修改,再调用remove()方法不生效; 2、各种连接:比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。 3、内部类和外部模块的引用 ;