Android进阶之路-自定义ButterKnife(下)
本篇实现效果:
本篇可以学到两个技能
- 使用动态累加载封装绑定API
- 在Jitpack上构建,制作个人依赖库
背景
前面自定义ButterKnife(中),已经实现ButterKnife的功能。但是仅仅在同一个project下,移植性较低,如果给其他项目用,我们需要复制gavin-butterknife-annotation,gavin-butterknife-processor两个module代码,毫无高端大气的感觉,对于有追求的人是绝对不会被允许的。
依然保持着靓仔的风范!
正文
分几个步骤优化一下我们的项目如下:
- 动态类加载封装API
- 在 JitPack 完成构建获取依赖库路径
- 在项目使用个人依赖库完成ButterKnife功能
动态类加载封装API
gavin-butterknife module中新建GavinButterKnife
public class GavinButterKnife {
public static void bind(Activity activity) {
// 动态类加载
try {
Class<?> obj = Class.forName(activity.getClass().getName() + Constant.CODE_CLASS_EXT_NAME);
GavinViewBinder viewBinder = (GavinViewBinder) obj.newInstance();
viewBinder.bind(activity);
} catch (Exception e) {
e.printStackTrace();
}
}
}
从上面的代码可以看到,我们创建GavinViewBinder对象没有通过new的方式,而是通过className字符串去获取到一个新的GavinViewBinder对象。实际上是jvm帮我们自动调用他的无参构造方法来生成新对象了,当然,如果你的构造方法有入参,也是可以动态类加载生成对象的。不展开讲了,想要了解的自行百度。
完成后,app module测试工程依赖这个module
//:app/build.gradle
dependencies{
implementation project(path: ':gavin-butterknife')
}
TestActivity引用
在 JitPack 完成构建获取依赖库路径
到github分别为注解和注解编译器新建一个工程
GavinButterKnifeAnnotation
gavinbutterknifecompiler
注意:project 和module的区别必须理解清楚。
project | 作用 |
---|---|
GavinButterKnife | 暴露API公调用方使用 |
gavinbutterknifecompiler | 注解编译器 |
GavinButterKnifeAnnotation | 注解 |
下面我们就用结构最简单的GavinButterKnifeAnnotation工程来说:
1、GitHub创建Project仓库
GavinButterKnifeAnnotation
2、project下的build.gradle引入依赖插件地址
//...
buildscript {
dependencies {
//...
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'//公共仓库
//...
}
}
allprojects {
repositories {
//...
maven {url "https://jitpack.io" }
}
}
//...
在需要被构建成依赖库的module/Java library下,build.gradle声明Group
这里我们将前面对应功能的module :gavin-butterknife-annotation 复制过来
记得根目录的settings.gradle里加上模块声明
include ':gavin-butterknife-annotation'
//:gavin-butterknife-annotation/build.gradle
plugins {
//...
id 'com.github.dcendents.android-maven'
}
// group='com.github.你的github用户名'
group='com.github.KubyWong'
//...
Github上打Release标签
在JitPack进行构建打包
打开https://jitpack.io/,用github账号登录,把要打包到公共仓库的github地址粘贴上去,点击绿色按钮,会展示出刚才我们打release标签的版本。
这里会自动构建,如果不会的话,点击status下的绿色按钮。构建成功后log是绿色的,失败则是红色。
好了,到这里我们就成功生成个人的依赖库了。努力了这么久,给大家放个福利。评论区告诉我,有没有初恋的感觉
测试效果
这里我偷下懒,直接在GavinButterKnife工程下测试。
拓展
如果全部放在同一个项目,多个module一起上传也是可以的,但是注解编译器的引入方式与普通的依赖库引入有别,关键字不一样,分别是annotationProcessor,implementation。所以我们还是需要分开制作依赖库。