最近項目中開始使用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 使用高階函數實現回調