Android中Retrofit通用API调用改造:动态传入POJO类
解决Retrofit API调用复用性问题:动态传入POJO类
嘿,作为Android新手遇到这个问题太正常啦!你现在的代码把NewMatchList硬编码在方法里,导致没法复用。咱们可以用Java的泛型来实现动态适配不同的POJO实体类,下面一步步来改:
第一步:理解问题根源
你之前直接替换NewMatchList为对象/类名报错,是因为Retrofit的Call和Callback都是和具体实体类绑定的,没有用泛型做类型抽象,编译器没法识别你要传入的动态类型,自然会报错。
第二步:编写通用的泛型API调用方法
咱们把API调用的核心逻辑抽成一个泛型方法,让它能接收任意类型的Call<T>,并把结果处理逻辑交给外部回调:
// 泛型方法,T代表任意POJO实体类 public <T> void callGenericApi(Call<T> apiCall, final GenericApiCallback<T> callback) { apiCall.enqueue(new Callback<T>() { @Override public void onResponse(Call<T> call, Response<T> response) { if (response.isSuccessful() && response.body() != null) { // 把成功结果传给外部回调处理 callback.onSuccess(response.body()); } else { // 处理请求成功但返回空/异常的情况 callback.onFailure(new Exception("请求成功但返回数据异常")); } } @Override public void onFailure(Call<T> call, Throwable t) { // 把错误信息传给外部回调 callback.onFailure(t); } }); } // 定义通用回调接口,让调用者自己处理结果 public interface GenericApiCallback<T> { void onSuccess(T data); void onFailure(Throwable error); }
第三步:调整你的ApiInterface(按需)
如果你的接口里有多个返回不同POJO的API方法,比如:
public interface ApiInterface { // 原有的NewMatchList请求 @GET("match/list") Call<NewMatchList> getNewMatchList(@Query("api_key") String apiKey); // 新增的其他POJO请求示例 @GET("match/history") Call<MatchHistory> getMatchHistory(@Query("api_key") String apiKey); }
第四步:调用通用方法
现在你可以用同一个callGenericApi方法调用不同的API,传入对应POJO的Call和回调逻辑:
调用NewMatchList的API
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call<NewMatchList> newMatchCall = apiService.getNewMatchList(API_KEY); callGenericApi(newMatchCall, new GenericApiCallback<NewMatchList>() { @Override public void onSuccess(NewMatchList data) { // 这里处理NewMatchList的业务逻辑 Log.d("ApiCall", data.getMatchList().get(0).getTeam1()); Toast.makeText(getApplicationContext(), "赛事列表加载成功", Toast.LENGTH_LONG).show(); } @Override public void onFailure(Throwable error) { Log.d("ApiCall_Error", error.toString()); } });
调用MatchHistory的API(示例)
Call<MatchHistory> historyCall = apiService.getMatchHistory(API_KEY); callGenericApi(historyCall, new GenericApiCallback<MatchHistory>() { @Override public void onSuccess(MatchHistory data) { // 这里处理MatchHistory的业务逻辑 Log.d("ApiCall", data.getHistoryList().size() + "条历史赛事"); Toast.makeText(getApplicationContext(), "历史赛事加载成功", Toast.LENGTH_LONG).show(); } @Override public void onFailure(Throwable error) { Log.d("ApiCall_Error", error.toString()); } });
为什么这样可行?
- 泛型
<T>让方法可以适配任意POJO类,编译器会在编译时检查类型安全性,避免类型转换错误 - 把结果处理逻辑(比如Toast、Log)放到外部回调里,让通用方法只负责API调用的核心逻辑,更灵活
- 避免了重复编写
enqueue和回调的模板代码,大大提升了代码复用性
内容的提问来源于stack exchange,提问作者scott
相关产品推荐
相关产品推荐

