You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:05