2017-04-05 64 views
6

我要讓void enqueue(Callback<T> callback);方法調用的代碼塊更有表現力,這是我有一個平時使用改造方法更具表現力的方式

request.enqueue(object : Callback<MyModel> { 
     override fun onFailure(call: Call<MyModel>?, t: Throwable?) { 
      // 
     } 

     override fun onResponse(call: Call<MyModel>?, response: Response<MyModel>?) { 
      // 
     } 
}) 

什麼都想和的意思是說,要改變這種代碼塊更清潔方式,並刪除這些覆蓋,對象,回調關鍵字,做這樣的事情:

request.enqueue({throwable, response -> })

我認爲它可能以某種方式使用擴展來改善s和更高階的功能。有誰知道它是如何做到的?

+0

是否使用RetroLambda插件? –

+0

不,我正在使用Kotlin –

+0

我認爲在Kotlin中你仍然可以使用Lambda表達式。請檢查,我認爲這是你所尋求的。 –

回答

7

鑑於以下功能:

fun <T> callback(fn: (Throwable?, Response<T>?) -> Unit): Callback<T> { 
    return object : Callback<T> { 
     override fun onResponse(call: Call<T>, response: retrofit2.Response<T>) = fn(null, response) 
     override fun onFailure(call: Call<T>, t: Throwable) = fn(t, null) 
    } 
} 

你可以像這樣與改造使用:

request.enqueue(callback({ throwable, response -> 
response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } 
throwable?.let { callBack.onFailed(throwable.message!!) }) 

或者,您也可以定義回調的這另一個版本:

fun <T> callback2(success: ((Response<T>) -> Unit)?, failure: ((t: Throwable) -> Unit)? = null): Callback<T> { 
    return object : Callback<T> { 
     override fun onResponse(call: Call<T>, response: retrofit2.Response<T>) { success?.invoke(response) } 
     override fun onFailure(call: Call<T>, t: Throwable) { failure?.invoke(t) } 
    } 
} 

,你可以直接使用:

request.enqueue(callback2(
       { r -> callBack.onResponse(r.body()) }, 
       { t -> callBack.onFailed(t.message) })) 
+0

非常好的解決方案 –

+1

在你的第二個版本的回調,'''樂趣 callback2(成功:(迴應 ) - >單位,失敗:(t:Throwable) - >單位):回撥? {'?或者回調可以爲空?我在那裏得到一個警告:「預期類型不接受Java中的空值,但Kotlin中的值可能爲空」 – noongiya95

+0

這就是您在不測試代碼的情況下編寫代碼的原因。更新了答案。 – pdpi

2

你可以做的是什麼(這是Java作爲我不知道很多科特林,但應該是相當類似):

public class CallbackWrapper<T> implements Callback<T> { 
    private Wrapper<T> wrapper; 

    public CallbackWrapper(Wrapper<T> wrapper) { 
     this.wrapper = wrapper; 
    } 

    public void onFailure(Call<T> call, Throwable t) { 
     wrapper.onResult(t, null); 
    } 

    public void onResponse(Call<T> call, Response<T> response) { 
     wrapper.onResult(null, response); 
    } 

    public static interface Wrapper<T> { 
     void onResult(Throwable t, Response<T> response); 
    } 
} 

,你可以使用如:

call.enqueue(new CallbackWrapper((throwable, reponse) - > {...})); 
+0

不錯的解決方案,也加入到包裝裏面的構造函數明確返回類型 –