Kotlin使用高階函數實現多方法回調

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章