我正在我的Android应用程序中构建网络结构,我意识到的一件事是我想做的是在我的请求类中创建自己的接口。
例如,我有此方法:
public static void getUserData(String owner, final DataManager.OnDataReceived<Owner> listener) {
Call<Owner> call = getGitService().getUser(owner);
call.enqueue(new Callback<Owner>() {
@Override
public void onResponse(Call<Owner> call, Response<Owner> response) {
}
@Override
public void onFailure(Call<Owner> call, Throwable t) {
}
});
}
现在。。。我所有的方法都以相同的方式响应回调,所以为什么不处理这一次呢?
所以我这样做的方式是创建实现改造回调接口的类:
private static class callbackHandler implements Callback {
final DataManager.OnDataReceived listener;
callbackHandler(DataManager.OnDataReceived listener) {
this.listener = listener;
}
@Override
public void onResponse(Call call, Response response) {
listener.onDataReceived(response.body(), getErrorFromResponse(response));
}
@Override
public void onFailure(Call call, Throwable t) {
listener.onDataReceived(null, t.toString());
}
}
所以现在所有请求都像这样:
public static void getUserData(String owner, final DataManager.OnDataReceived<Owner> listener) {
Call<Owner> call = getGitService().getUser(owner);
call.enqueue(new callbackHandler(listener));
}
更清晰...
1 . 您如何看待此解决方案? 我有更好的方法来以相同的方式处理所有回调?2 .编译器对我大喊
call.enqueue(new callbackHandler(listener));
和
@Override
public void onResponse(Call call, Response response) {
listener.onDataReceived(response.body(), getErrorFromResponse(response));
}
@Override
public void onFailure(Call call, Throwable t) {
listener.onDataReceived(null, t.toString());
}
和我的界面:
public interface OnDataReceived<T> {
void onDataReceived(T data, String error);
}
是未选中的分配...我明白这意味着什么,但不确定如何解决这个问题?
更新:未选中的解决方案
private static class callbackHandler<T> implements Callback<T> {
final DataManager.OnDataReceived<T> listener;
callbackHandler(DataManager.OnDataReceived<T> listener) {
this.listener = listener;
}
@Override
public void onResponse(Call<T> call, Response<T> response) {
listener.onDataReceived(response.body(), getErrorFromResponse(response));
}
@Override
public void onFailure(Call<T> call, Throwable t) {
listener.onDataReceived(null, t.toString());
}
}
您如何看待此解决方案?
这称为适配器模式。您正在将一个接口(Callback<Owner>
(调整为另一个接口(DataManager.OnDataReceived<Owner>
(。
如果您的目标是将来能够用其他东西替换 Retrofit,那么这种适配器是完全合理的。否则,您可以考虑只DataManager.OnDataReceived
扩展Callback
并更改方法名称以匹配(例如,onDataReceived()
变成onResponse()
(,以避免需要此适配器。
我明白这意味着什么,但不确定如何解决这个问题
callbackHandler implements Callback
消除了Java泛型。
如果这仅用于Owner
,请使用callbackHandler implements Callback<Owner>
并使其保持DataManager.OnDataReceived<Owner>
。如果您计划将其用于多个模型对象(假设Owner
是一个模型(,请使用 callbackHandler implements Callback<T>
并让它保持DataManager.OnDataReceived<T>
。