最近项目中开始使用kotlin,遇到的一个问题就是从多方法回调的问题
常规的java回调如下:
public interface OnCallBack<T> {
void onSuccess(T models);
void onFailed(String message);
}
public abstract class OnRespCallBack<T> implements OnCallBack<T> {
@Override
public void onFailed(String message) {
//请求失败
}
}
public void getData(OnRespCallBack<String> callBack) {
//进行网络请求或者其他耗时操作
...
callBack.onSuccess(response);
//请求失败时的回调
...
callBack.onFailed(message);
}
public void setData() {
getData(new OnRespCallBack<String>() {
@Override
public void onSuccess(String result) {
//do success
}
@Override
public void onFailed(String message) {
super.onFailed(message);
//do fail
}
});
}
使用kotlin的话,可以使用匿名内部类来实现,回调方法调用如下:
pubcli void setData() {
getData(object : OnRespCallBack<String>() {
override fun onSuccess(models: String) {
//do success
}
override fun onFailed(message: String) {
super.onFailed(message)
//do fail
}
})
}
但是如此使用,很不方便,也体现不出来kotlin简洁的优势,这时候就可以考虑使用kotlin的高级函数了。
对于上面的多方法回调,有如下两种修改方式:
方式一:在java基础上修改
class OnCallbackImpl<T>(private val onSuccessF: (T) -> Unit, private val onErrorF: ((String) -> Unit)? = null): OnCallback<T> {
override fun onSuccess(response: T) {
onSuccessF(response)
}
override fun onFailed(message: String) {
onErrorF?.let { it(message)}
}
}
fun getData(callBack:OnRespCallBack<String>) {
//进行网络请求或者其他耗时操作
...
callBack.onSuccess(response)
//请求失败时的回调
...
callBack.onFailed(message)
}
pubcli void setData() {
getData(OnCallbackImpl(onSuccessF = {
//do success
}, onErrorF = {
//do error
})
)
}
方式二:用更kotlin的方式
class OnCallbackImpl<T>: OnCallback<T> {
private lateinit var onSuccessF: (T) -> Unit
private lateinit var onErrorF: (String) -> Unit
fun onSuccess(listener:(T)->Unit) {
this.onSuccessF = listener
}
override fun onSuccess(response: T) {
this.onSuccessF(response)
}
fun onFailed(listener: (String) -> Unit) {
this.onErrorF = listener
}
override fun onFailed(message: String) {
this.onErrorF(message)
}
}
fun getData(callback: OnCallbackImpl<String>.() -> Unit) {
val back = OnCallbackImpl<String>()
back.callback()
//进行网络请求或者其他耗时操作
...
back.onSuccess(response)
//请求失败时的回调
...
back.onFailed(message)
}
pubcli void setData() {
getData{
onSuccess {
//do success
}
onFailed {
//do error
}
}
}
参考文章:
Kotlin多方法回调简化(Lambda表达式,recyclerView回调)
kotlin 多接口回调的实现方式(一)
kotlin 多接口回调的实现方式(二)
Kotlin 使用高阶函数实现回调