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

Android中使用Retrofit获取对象数组遇API加载错误求助

排查Retrofit加载API数据失败的常见问题

看起来你在Retrofit调用本地服务器时遇到了加载错误,别着急,咱们一步步来排查这些常见的坑:

1. 先确认本地服务器的可达性

Android模拟器默认不能直接用localhost访问你的电脑本地服务器,得换成10.0.2.2(这是模拟器映射到宿主电脑localhost的特殊地址)。如果是真机测试,要确保手机和电脑在同一局域网,用电脑的局域网IP(比如192.168.x.x)作为baseUrl。

比如你的baseUrl应该改成:

String baseUrl = "http://10.0.2.2:8080/"; // 假设服务器端口是8080

2. 检查Android网络权限和明文流量设置

  • 首先在AndroidManifest.xml里添加必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 如果你的本地服务器用的是HTTP(不是HTTPS),Android 9及以上默认禁止明文流量,需要在res/xml下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">10.0.2.2</domain> <!-- 或者你的局域网IP -->
    </domain-config>
</network-security-config>

然后在AndroidManifest.xml的<application>标签里引用这个配置:

android:networkSecurityConfig="@xml/network_security_config"

3. 完善RetrofitClient的单例实现

你给出的代码里getClient方法没写完,要确保baseUrl的格式正确(必须以/结尾),同时单例逻辑要严谨:

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        // 确保baseUrl以/结尾,避免路径拼接错误
        if (!baseUrl.endsWith("/")) {
            baseUrl += "/";
        }
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

4. 捕获详细错误信息,别只显示通用提示

你现在只看到“error loading from API”,根本不知道具体是啥问题!一定要在回调里打印错误详情:
比如用Callback的写法:

yourApiService.getData().enqueue(new Callback<YourDataModel>() {
    @Override
    public void onResponse(Call<YourDataModel> call, Response<YourDataModel> response) {
        if (!response.isSuccessful()) {
            // 打印响应码和错误提示
            Log.e("RetrofitError", "Code: " + response.code() + ", Message: " + response.message());
            if (response.errorBody() != null) {
                try {
                    Log.e("RetrofitError", "Error Body: " + response.errorBody().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return;
        }
        // 处理成功返回的数据
    }

    @Override
    public void onFailure(Call<YourDataModel> call, Throwable t) {
        // 打印失败原因,比如网络不通、解析错误
        t.printStackTrace();
        Log.e("RetrofitError", "Failure Reason: " + t.getMessage());
    }
});

通过这些日志,你能快速定位是网络问题、服务器返回错误,还是Gson解析失败。

5. 检查API接口定义是否匹配服务器端点

比如你的服务器API是GET /api/users,那Retrofit接口要这么写:

public interface YourApiService {
    @GET("api/users") // 注意这里的路径是baseUrl之后的部分,baseUrl已经包含了/
    Call<List<User>> getUsers();
}

如果路径写错、请求方法不匹配(比如服务器是POST你用了GET),都会导致请求失败。

6. 验证数据模型和JSON格式是否匹配

Gson解析失败是常见问题,要确保你的数据类字段和服务器返回的JSON键完全一致(或者用@SerializedName注解映射)。比如服务器返回:

{
    "id": 1,
    "username": "test"
}

你的数据类应该是:

public class User {
    private int id;
    private String username;

    // 添加上getter和setter方法
    // 如果JSON键和字段名不一样,用注解映射:
    // @SerializedName("user_name")
    // private String username;
}

先按这些步骤排查,尤其是先打印详细错误日志,这是解决问题的关键!

内容的提问来源于stack exchange,提问作者user7128116

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:06:36