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 对象?
在我的一个项目中,我遇到了类似的问题,无法使用 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 对象,封装请求逻辑。
这样你就可以随心所欲地工作;在公开定义良好的接口的同时实现缓存、请求、取消等。
希望这可以帮助。