我正在我的android应用程序中构建网络结构,我意识到我想做的一件事是在我的请求类中创建我自己的接口(interface)。
我有这个方法,例如:
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) {
}
});
}
现在...我的所有方法都以相同的方式响应回调,所以为什么不处理一次呢?
所以我这样做是为了创建实现改造回调接口(interface)的类:
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());
}
}
最佳答案
what do you think about this solution ?
这称为the adapter pattern 。您正在将一个接口(interface) ( Callback<Owner>
) 调整为另一个接口(interface) ( DataManager.OnDataReceived<Owner>
)。
如果您的目标是将来能够用其他东西替换 Retrofit,那么这种适配器是完全合理的。否则,您可能会考虑只拥有 DataManager.OnDataReceived
延长Callback
并更改您的方法名称以匹配(例如, onDataReceived()
变为 onResponse()
),以避免需要此适配器。
i understand what that means but not sure how to fix this
callbackHandler implements Callback
消除了 Java 泛型。
如果这仅适用于Owner
,使用callbackHandler implements Callback<Owner>
并让它持有 DataManager.OnDataReceived<Owner>
。如果您计划将其用于多个模型对象(假设 Owner
是一个模型),请使用 callbackHandler implements Callback<T>
并让它持有 DataManager.OnDataReceived<T>
.
关于java - 例如,Java 中的最佳实践是创建我自己的界面,而不是改造中现有的界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42977562/