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

标签 java android interface retrofit

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

相关文章:

interface - 用 UML 表示/说明两个独立程序之间的通信?

java - XML 解析器条件的 If 条件

java - 不同机器上的字符编码

java - 检查多个 Realm 模型的 id 是否存在

android - Android BBC 新闻和 Pulse 新闻应用程序是如何实现水平 ScrollView 的?

c# - 在 C# 中实现 ISP 设计模式

从我的 C 程序调用 Esper

java - 运行 Android 应用程序时出错

android - 输入类型 = "text"时强制使用数字键盘

android - 带有 ListView 和 setAdapter 的 NullPointerException