gpt4 book ai didi

android - 实现 Retrofit2 服务接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 16:31:24 26 4
gpt4 key购买 nike

想象一下以下场景。

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

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

问题是 retrofit2 中的所有服务方法都应该包装在 Call 对象中,因为它可以防止像以前版本的 retrofit 那样将回调作为参数传递。

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

最佳答案

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

首先,我创建了一个具有清晰 API 的自定义 Callback 类。这样我就可以更简洁地处理 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);

}

然后我创建了一个Command界面:

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

}

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

Android Retrofit Command Pattern

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

希望这对您有所帮助。

关于android - 实现 Retrofit2 服务接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37595940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com