1、kotlin回调和java回调的对比
废话不多说,人狠话不多,直接撸代码:
kotlin的回调
class A{
fun setListeren(canshu1:Int,mListen: (String?) -> Unit) {
//费时的操作-------后调用mListen
mListen("回调的内容")//运行到Log.d的传入监听
}
}
class B{
a:A=A()
//为了更直观看到参数和回调的参数,所以多加了参数233,不要的可以省略
a.setListeren(233){
Log.d(TAG, "回调内容为:$it")
}
}
java的回调
/**
* 按钮式回调
*/
public class B {
public void bb() {
new A().setmOnclickListen(new A.ClickCallback() {
@Override
public void clickCallback() {
Log.d("111", "=返回到这运行=");
}
});
}
}
public class A {
private ClickCallback mCallback;
public void aa() {
new Handler().postDelayed(new Runnable() {
public void run() {
//耗时操作
mCallback.clickCallback();//返回到B那里去运行代码
}
}, 2000);
}
//自定义回调接口
public interface ClickCallback {
void clickCallback();
}
public void setmOnclickListen(ClickCallback callback) {//构造函数中传callback进来
this.mCallback = callback;
}
}
2、Lambda的使用
我们用java写radiogroup的实现方式为:
radiogroup =(RadioGroup)this.findViewById(R.id.encoding);
radiogroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//这里根据checkedId来判断选择了哪个
}
});
下面我们来看看使用Lambda来写:
//radioGroup是控件RadioGroup的id
radioGroup.setOnCheckedChangeListener { radioGroup: RadioGroup, checkedId: Int ->
//这里根据checkedId来判断选择了哪个
when (checkedId) {
R.id.rb_4 -> {
Log.d("11", "选择了样式一")
}
}
}
3、 java调kotlin的Unit方法
kotlin代码如下:
fun selectResultCall(mListen: (Int) -> Unit) {
*** = mListen
}
java调用kotlin的selectResultCall方法
***.selectResultCall((integer) -> {
Log.e("TAG","接收到选择的数据为");
return null;
});
4、使用接口(interface)回调
1.定义回调接口
interface Callback {
fun onResult(result: String)
}
实现回调接口的类
class TaskPerformer {
fun performTask(callback: Callback) {
// 执行任务
val result = "Task completed"
// 调用回调方法
callback.onResult(result)
}
}
2.kotlin使用回调接口
val performer = TaskPerformer()
performer.performTask(object : Callback {
override fun onResult(result: String) {
// 处理回调结果
println(result)
}
})
3.封装一个通用的接口回调,可以放到公共模块里,在任何地方都可以使用
public interface Callback<T> {
void accept(T result);
void onError(Exception e);
}
kotlin写法。默认的接口实现,实现接口时候不需要每个方法都实现
open interface CallBack<T> {
fun execute(result: T){}
// 扫描结果回调
fun scanResult(result: T){}
}
4.rxjava提供了一个好用的接口回调consumer,使用可以查看:
https://blog.csdn.net/wy313622821/article/details/122443098