0%

今天试着写一下ButterKnife的原理,虽然网上已经有很多说的了,但是代码还是要亲手打出来,而且网上都是旧版本的gradle,仍然用的apt插件,gradle 3.0已经不需要了,而且是不能用apt了

因为代码部分比较简单,所以只写一下步骤。

阅读全文 »

假如我们有这样一个需要,我们想要一个带消息队列的子线程,带消息队列是因为我们还希望和子线程有一个交互,如果只是一个runnable,那么就是一次性的任务。

这个时候很容易想到Looper,Handler之类的,

考虑到需要进行任务的处理,我们需要继承Handler来处理任务,

因为是子线程,所以需要这个子线程能够提供Looper来构造handler,

如果有这样一个接口,那么我们在Thread的runnable函数里面,就要执行Looper.prepar和Looper.loop,这两个函数,一个是new Looper出来,一个是启动消息循环,没有消息时会阻塞,因此runnable不会执行完流程而导致线程退出。

阅读全文 »

来源:《深入理解Java虚拟机(第2版)》

Java虚拟机-类,对象,内存

类加载

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

虚拟机规定了有且只有五种情况需要开始类的加载过程:

  1. 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候,读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
  2. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
  3. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
  4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
阅读全文 »

这里是原文地址

界面卡顿问题

大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

阅读全文 »

来源:《深入理解Java虚拟机(第2版)》

通常来说,人们会把Java和垃圾收集器(GC)绑定在一起,事实上GC的历史比Java要更久远。GC一般需要完成三件事:

  • 哪些内存需要回收
  • 什么时候进行回收
  • 怎么回收

对于Java来说,

  • 程序计数器,虚拟机栈,本地方法栈3个区域,因为它们都是线程私有的,线程结束了它们也就回收了,而栈的栈帧随着方法的调用有序的执行入栈和出栈的操作,因此方法结束时,这部分也回收了;

  • Java堆和方法区,这部分的内存分配和回收都是动态的,不确定的,因此也是GC所关注的区域。

阅读全文 »

贝塞尔曲线是在计算机图形学和相关领域内常用的一种参数曲线,它的主要应用有

  • 生成光滑的曲线
  • 动画
  • 圆滑的字体,比如TrueType
阅读全文 »