今天试着写一下ButterKnife的原理,虽然网上已经有很多说的了,但是代码还是要亲手打出来,而且网上都是旧版本的gradle,仍然用的apt插件,gradle 3.0已经不需要了,而且是不能用apt了
因为代码部分比较简单,所以只写一下步骤。
今天试着写一下ButterKnife的原理,虽然网上已经有很多说的了,但是代码还是要亲手打出来,而且网上都是旧版本的gradle,仍然用的apt插件,gradle 3.0已经不需要了,而且是不能用apt了
因为代码部分比较简单,所以只写一下步骤。
假如我们有这样一个需要,我们想要一个带消息队列的子线程,带消息队列是因为我们还希望和子线程有一个交互,如果只是一个runnable,那么就是一次性的任务。
这个时候很容易想到Looper,Handler之类的,
考虑到需要进行任务的处理,我们需要继承Handler来处理任务,
因为是子线程,所以需要这个子线程能够提供Looper来构造handler,
如果有这样一个接口,那么我们在Thread的runnable函数里面,就要执行Looper.prepar和Looper.loop,这两个函数,一个是new Looper出来,一个是启动消息循环,没有消息时会阻塞,因此runnable不会执行完流程而导致线程退出。
来源:《深入理解Java虚拟机(第2版)》
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
虚拟机规定了有且只有五种情况需要开始类的加载过程:
问题描述:n个人(编号1~n),从1开始报数,报到m的退出,剩下的人继续从1开始报数。求胜利者的编号
链表是很常用的数据结构,JDK已经提供了LinkedList,也就是双向链表。今天写了个单链表,主要是想写一下单链表的逆置:
来源:《深入理解Java虚拟机(第2版)》
通常来说,人们会把Java和垃圾收集器(GC)绑定在一起,事实上GC的历史比Java要更久远。GC一般需要完成三件事:
对于Java来说,
程序计数器,虚拟机栈,本地方法栈3个区域,因为它们都是线程私有的,线程结束了它们也就回收了,而栈的栈帧随着方法的调用有序的执行入栈和出栈的操作,因此方法结束时,这部分也回收了;
Java堆和方法区,这部分的内存分配和回收都是动态的,不确定的,因此也是GC所关注的区域。