使用改造方法更具表现力的方式
我想使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 -> })
我认为可以使用扩展和更高阶的函数来改进。 有谁知道它是如何做到的?
鉴于以下功能:
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): Callback<T>? { return object : Callback<T> { override fun onResponse(call: Call<T>, response: retrofit2.Response<T>) = success(response) override fun onFailure(call: Call<T>, t: Throwable) = failure(t) } }
您可以使用它作为:
request.enqueue(callback2( { r -> callBack.onResponse(r.body()) }, { t -> callBack.onFailed(t.message) }))
你可以做的是这个(这是Java,因为我不太了解Kotlin,但应该是非常相似的):
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) - > {...}));