一、闭包委托
- 闭包有thisObject、owner、delegate三个属性,在闭包内调用方法的时候,由他们来确定使用哪个对象呢来进行处理。默认情况下delegate和owner是相等的,当时delegate是可以被修改的,这个功能是非常强大的,Gradle中的闭包很多功能都是通过修改delegate进行实现的。
task helloDelegate { new Delegate().test { println "thisObject:${thisObject.getClass()}" println "owner:${owner.getClass()}" println "delegate:${delegate.getClass()}" println "================" method1() println "================" it.method1() } }def method1() { println "Context this:${this.getClass() } int root" println "method1 in Delegate" }class Delegate { def method1() { println "Delegate this:${this.getClass() } int Delegate" println "method1 in Delegate" }def test(Closure
closure) { closure(this) } }
文章图片
task configClosure {
person {
personName = "张三"
personAge = 20
dumpPerson()
}
}class Person {
String personName
int personAgedef dumpPerson() {
println "name is ${personName}, age is ${personAge}"
}
}def person(Closure closure) {
Person p = new Person();
closure.delegate = p
// 委托模式优先
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
closure(p)
}
文章图片
二、task,doFirst,doLast
task customTask1 {
doFirst {
println 'customTask1:doFirst'
}
doLast {
println 'customTask1:doLast'
}
}tasks.create("customTask2") {
doFirst {
println 'customTask2:doFirst'
}
doLast {
println 'customTask2:doLast'
}
}
- 这两种方式都是可以的,task是Project对象的一个函数,原型为create(String name, Closure configureClosure)
- customTask1为任务的名字,我们可以自定义;第二个参数是一个闭包,也就是我们花括号里面的代码块,根据我们讲的Groovy的只是,最后一个参数是闭包的时候,也可以放到括号外面,然后方法的括号是可以进行省略的,就可以生成了我们上面的写法,很简洁。该闭包作用就是用来对我们创建的任务进行配置,例子中我们用了任务的doFirst和doLast方法,分别在任务执行前后输出了一段文字,除此之外还有其他方法,属性等。
三、任务依赖task ex35Hello { println 'hello' }task ex35Main(dependsOn: ex35Hello) { doLast { println 'main' } }
文章图片
- 从上面可以看出来任务ex35Main是依赖第一个任务,我们在这里面写入了dependsOn关键字,进行添加前置任务,下面来看一下,增加一下多个任务
task ex35Hello { println 'hello' }task ex35Main(dependsOn: ex35Hello) { doLast { println 'main' } }task ex35World { println 'world' }task ex35MultiTask { dependsOn ex35Hello, ex35World doLast { println 'multiTask' } }
文章图片
四、任务键通过API控制、交互task ex36Hello { println 'dowLast1' }ex36Hello.doFirst { println 'dowFirst' }ex35Hello.doLast { println project.hasProperty('ex36Hello') // 说明每一个任务都是Project的一个属性 println 'dowLast2' }
- 在Project中每一个task都是一个属性,我们从上面返回的判定结果中就可见一斑。
文章图片
五、自定义属性// 自定义一个Project的属性 ext.age = 18// 通过代码块同时自定义多个属性 ext { phone = 1334512 address = '' }sourceSets.all { ext.resourcesDir = null }sourceSets { main { resourcesDir = "main/res" }test { resourcesDir = "test/res" } }task ex37CustomProperty { println "年龄是:${age}" println "电话是:${phone}" println "地址是:${address}"sourceSets.each { println "${it.name}的resourcesDir是:${it.resourcesDir}" } }
文章图片
- 自定义的属性都生效了,在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个Gradle文件中,因为他们每次发布版本的时候都会改变,变动频繁,放到一个单独的Gradle文件中,便于管理,而且改动的时候不会因为Git冲突影响整个Build文件,便于解决冲突。
六、脚本代码def buildTime() { def date = new Date() def formattedDate = date.format("yyyyMMdd") return formattedDate }
- 【Gradle连载2-多种方式创建任务】在build.gradle文件中可以使用Java代码,Groovy代码和Gradle,灵活使用这些代码,可以使工程更能智能,多样化。
七、源码 - gitee路径:https://gitee.com/dongqianrui...
- CSDN:https://blog.csdn.net/weixin_...
- 博客园:https://www.cnblogs.com/ruige...
- 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流
文章图片
本文由博客一文多发平台 OpenWrite 发布!
推荐阅读
- Android的开机流程
- Android判断网络状态
- Android滑动到顶部悬停
- Android Gradle 学习笔记1
- Android之省市区三级联动
- Android Sqlite3工具的使用
- Android中动画的移动起始位置
- Android SDK开发包国内下载地址
- Android native thread相关