一、闭包委托
- 闭包有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<Delegate> closure) {
closure(this)
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/c7521e5f136846f7b8ee26f80b6ffc49.png)
```groovy
task configClosure {
person {
personName = "张三"
personAge = 20
dumpPerson()
}
}
class Person {
String personName
int personAge
def dumpPerson() {
println "name is ${personName}, age is ${personAge}"
}
}
def person(Closure<Person> 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' } }
![1.3](https://img-blog.csdnimg.cn/330b3f658d914c6a888a34388693d95c.png)
- 从上面可以看出来任务ex35Main是依赖第一个任务,我们在这里面写入了dependsOn关键字,进行添加前置任务,下面来看一下,增加一下多个任务
```groovy
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}"
}
}
![1.6](https://img-blog.csdnimg.cn/1efce6f7331249ef8244c42aa8f473c7.png)
- 自定义的属性都生效了,在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个Gradle文件中,因为他们每次发布版本的时候都会改变,变动频繁,放到一个单独的Gradle文件中,便于管理,而且改动的时候不会因为Git冲突影响整个Build文件,便于解决冲突。
## 六、脚本代码
```groovy
def buildTime() {
def date = new Date()
def formattedDate = date.format("yyyyMMdd")
return formattedDate
}
- 在build.gradle文件中可以使用Java代码,Groovy代码和Gradle,灵活使用这些代码,可以使工程更能智能,多样化。
七、源码
- gitee路径:https://gitee.com/dongqianrui/AndroidStudioProject/tree/master/Test1
- CSDN:https://blog.csdn.net/weixin_44630050
- 博客园:https://www.cnblogs.com/ruigege0000/
- 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流
本文由博客一文多发平台 OpenWrite 发布!