例如,Java 中的最佳实践是创建我自己的界面,而不是在改造中现有的界面



我正在我的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>

最新更新