美文网首页kotlinAndroid进阶
我的Kotlin 学习之路(三)Kotlin之回调监听

我的Kotlin 学习之路(三)Kotlin之回调监听

作者: 活着工作室 | 来源:发表于2017-06-06 15:13 被阅读2743次

kotlin的回调与java在写法上略有不同,直接上代码
(为了好理解,我先按java写法,不用Lambda)

1、生成Person类及MyInterface 接口

class Person {
    val name:String = "Person"
    lateinit var mListen: MyInterface //接口可以延时加载

    fun setListeren(listen: MyInterface){
        this.mListen = listen
        this.mListen?.poo(" poo :" +name)       
    }
    
    interface MyInterface {
        fun poo(str: String)  
    }
}

2、在Main或Activity中回调

fun main(args: Array<String>) {
    println("Hello, world!") 
    var person = Person()
    person.setListeren(object : Person.MyInterface {//object的作用是调用内部匿名类
        override fun poo(str:String) {
            println(str)
        }
     })   
}

3、打印结果
Hello, world!
poo :Person

以上是用原java写法来实现kotlin回调的,目的是从java转来的人好理解

那么重点在下面
我们刚才只是用java的习惯来实现了kotlin语言的回调,那么抛开java习惯,用kotlin习惯应该怎么写呢?

先认识一个概念
函数 : 一个单方法的接口

再上代码,看看kotlin是如何简化java代码的

class Person {
    val name:String = "Person"
    lateinit var mListen: (String) -> Unit // 声明mListen是一个函数(单方法接口),入参String,无返回值

    fun setListeren(listener: (String) -> Unit){
        this.mListen = listener
        this.mListen("invoke :" +name) //等于 mListen?.invoke("invoke :" +name)  X()等同于X.invoke()
           
    }
   
    //不再需要声明接口类!
}

fun main(args: Array<String>) {
    println("Hello, world!") 
    var person = Person()
    person.setListeren{ println(it) }  // 只有一个参数的简化结果 it代表入参 String类 
}

打印结果
Hello, world!
invoke :Person

这就是kt语言!函数思维模式,不同于java,慢慢习惯就好了

相关文章

网友评论

  • 小川君:如果是多函数的回调,是仿java还是另有其他的写法
  • 3191134197b7:person.setListeren应该有两种方式实现一个是楼主您写的这样person.setListeren{}
    还有一个是person.setListeren()请问小括号的这种方式怎么去实现啊?
    活着工作室:@3191134197b7 见小2内,有写

本文标题:我的Kotlin 学习之路(三)Kotlin之回调监听

本文链接:https://www.haomeiwen.com/subject/zcegfxtx.html