实现 Retrofit2 服务接口

sam*_*024 2 android android-networking retrofit retrofit2

想象一下下面的场景。

我使用 Retrofit 作为我的 API 客户端,我将使用缓存机制在本地保存一些响应,比如 SQLite 数据库,所以一些数据只获得一次。为以下接口创建自定义实现似乎是一个完美的案例,该接口将在网络不可用时从本地数据库获取数据。

public interface CommentsService {  
    @GET("posts/{postId}/comments")
    Call<List<Comment>> getCommentsOfPost(@Path("postId") int id);
}
Run Code Online (Sandbox Code Playgroud)

问题在于,retrofit2 中的所有服务方法都应该包装在一个Call对象中,因为它会阻止像以前版本的改造一样将回调作为参数传递。

我想知道创建此接口的自定义实现是否是一个好习惯,如果是,那么如何处理 Call 对象?

Mar*_*rdo 5

在我的一个项目中,我遇到了类似的问题,无法使用 RxJava。我通过使用命令模式解决了这个问题。

首先,我创建了一个带有清晰 API的自定义回调类。这样我就可以更简洁地处理 HTTP 代码(例如 400 或 500)。

public abstract class RestCallback<T> implements Callback<T> {

    @Override
    public void onResponse(Response<T> response, Retrofit retrofit) {
        if (response != null) {
            if (response.isSuccess()) {
                onSuccess(response, retrofit);
            } else {
                onError(response, retrofit);
            }
        } else {
            onFailure(null);
        }
    }

    abstract public void onSuccess(Response<T> response, Retrofit retrofit);

    abstract public void onError(Response<T> response, Retrofit retrofit);

    abstract public void onFailure(Throwable t);

}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个命令接口:

public interface Command {

    // New network hit
    void fresh(RestCallback callback);

    // First cached if available then fresh
    void all(RestCallback callback);

    // Cached response only
    void cached(RestCallback callback);

    // If cache exists return it, otherwise return a fresh response
    void get(RestCallback callback);

    // Cancel the request
    void cancel();

}
Run Code Online (Sandbox Code Playgroud)

这样,您将实现 Command 接口并使用它,而不是直接使用 Retrofit 对象。例如,您可以创建一个 GetCommentsOfPostCommand 并让它处理 Retrofit Call 对象,封装请求逻辑。

Android 改造命令模式

这样你就可以随心所欲地工作;在公开定义良好的接口的同时实现缓存、请求、取消等。

希望这可以帮助。