前言
最近將一些Java代碼改成Kotlin代碼,在改造過程中經(jīng)常遇到“事件(函數(shù))”的回調(diào);針對這幾種回調(diào)的實現(xiàn),做一次小小的總結(jié);
回調(diào)的接口使用Java語言
在Java中我們實現(xiàn)”事件(函數(shù))"的回調(diào),通常使用的是Interface(接口)的方式,基本步驟如下:
調(diào)用方:
1.在類中定義一個回調(diào)接口;
2.在這個接口中定義回調(diào)事件;
3.定義一個擁有執(zhí)行回調(diào)的接口變量;
public class MyButtonJava {
public String mTag = "";
interface ClickLister {
void onClickDown(String tag);
}
private ClickLister mClickListener = null;
void setListener(ClickLister listener){
this.mClickListener = listener;
}
//在某些業(yè)務中進行回調(diào)
void doSomeThing(){
this.mClickListener.onClickDown(mTag);
}
}
被調(diào)用方:
1.Java中使用lamda表達式方式調(diào)用
MyButtonJava myButton = new MyButtonJava();
myButton.mTag = this.getClass().getName();
myButton.setListener(tag -> ToastUtils.showToast(tag));
myButton.doSomeThing();
但是如果JAVA類中有兩個接口,則無法使用lamda表達式
2.Java中使用‘實現(xiàn)接口’的方式調(diào)用
MyButtonJavaTwoEvent myButtonTwo = new MyButtonJavaTwoEvent();
myButtonTwo.mTag = this.getClass().getName();
myButtonTwo.setListener(new MyButtonJavaTwoEvent.ClickLister() {
@Override
public void onClickDown(String tag) {
ToastUtils.showToast(tag);
}
@Override
public void onClickUp(String tag) {
ToastUtils.showToast(tag);
}
});
myButtonTwo.doSomething();
3.Kotlin中設置只有一個回調(diào)函數(shù)的JAVA接口
val myButtonJava = MyButtonJava()
myButtonJava.mTag = this.javaClass.name
myButtonJava.setListener{ tag -> ToastUtils.showToast(tag)}
myButtonJava.doSomeThing()
3.Kotlin中設置有兩個回調(diào)函數(shù)的JAVA接口
val myButtonJavaTwo = MyButtonJavaTwoEvent()
myButtonJavaTwo.setListener(object : MyButtonJavaTwoEvent.ClickLister{
override fun onClickUp(tag: String?) {
ToastUtils.showToast(tag)
}
override fun onClickDown(tag: String?) {
ToastUtils.showToast(tag)
}
})
回調(diào)的接口使用Kotlin語言
如果回調(diào)的接口使用Kotlin實現(xiàn),通常接口的定義可以使用兩種方式
1.使用Unit方式實現(xiàn)
class MyButtonKotlinUnit {
var mTag:String = ""
private lateinit var mClickListener : (String) -> Unit? //接口可以延時加載
fun setListener(listener: (String) -> Unit?){
this.mClickListener = listener
}
fun init(){
this.mClickListener.invoke(mTag)
}
}
2.使用Interface方式實現(xiàn)
class MyButtonKotlinInterface{
var mTag = ""
interface ClickLister {
fun onClickDown(tag: String)
}
private var mClickListener: ClickLister? = null
fun setListener(listener: ClickLister) {
this.mClickListener = listener
}
fun init() {
this.mClickListener!!.onClickDown(mTag)
}
}
這樣在設置回調(diào)函數(shù)時的實現(xiàn)方法有:
1.在JAVA中設置使用Interface方法的接口
MyButtonKotlinInterface myButtonKotlinInterface = new MyButtonKotlinInterface();
myButtonKotlinInterface.setListener(tag -> ToastUtils.showToast(tag));
2.在Java文件中不能使用Kotlin的Unit方式回調(diào)事件
以下編碼在編譯期會報錯
MyButtonKotlinUnit myButtonKotlin = new MyButtonKotlinUnit();
myButtonKotlin.setMTag(this.getClass().getName());
//編譯期報錯:錯誤: 不兼容的類型: lambda 表達式中的返回類型錯誤 void無法轉(zhuǎn)換為Unit
//Bad return in type lambda expression : void cannot be converted to Unit
//myButtonKotlin.setListener(tag -> ToastUtils.showToast(tag));
//myButtonKotlin.doSomeThing();
3.在kotlin中使用unit方式設置
val myButtonKotlin = MyButtonKotlinUnit()
myButtonKotlin.mTag = this.javaClass.name
myButtonKotlin.setListener { tag -> ToastUtils.showToast(tag) }
myButtonKotlin.init()
4.在kotlin中設置使用Interface方式實現(xiàn)的回調(diào)
val myButtonKotlinTwo = MyButtonKotlinInterface()
myButtonKotlinTwo.mTag = this.javaClass.name
myButtonKotlinTwo.setListener(object:MyButtonKotlinInterface.ClickLister{
override fun onClickDown(tag: String) {
ToastUtils.showToast(tag)
}
})