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

时间:2017-03-23 13:32:33

标签: java android interface retrofit

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

        }
    });
}

现在...我的所有方法都以同样的方式响应回调,为什么不处理这一次?

所以我这样做是为了创建实现改进Callback接口的类:

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());
    }
}

1 个答案:

答案 0 :(得分:1)

  

您对此解决方案有何看法?

这称为the adapter pattern。您正在调整一个界面(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>