我已经失去了我的星期天试图了解我的https电话出了什么问题。这是我拨打https休息服务的代码:
String url = AppUtils.env.getValue()+"announcementsservice/getYears";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String jsonResponse) {
AnnouncementsResponse response = (AnnouncementsResponse)
AppUtils.convertJsonResponse(AnnouncementsResponse.class, jsonResponse);
arrayAdapter.clear();
arrayAdapter.setNotifyOnChange(false);
for (Integer year : response.getYears()) {
arrayAdapter.add(String.valueOf(year));
}
arrayAdapter.setNotifyOnChange(true);
arrayAdapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("tag", "Error: " + error.getMessage());
Toast.makeText(getApplicationContext(), "Error while loading ... ", Toast.LENGTH_SHORT).show();
}
});
我正在使用volley来调用服务而gson正在解析响应。我已经尝试了nexus 4模拟器上的代码,一切正常。然后我尝试通过usb在Vernee物理设备(os 5.1 sdk 22)上安装应用程序,一切正常。然后我尝试通过谷歌播放商店(alpha测试)在同一个Vernee设备上安装应用程序,并且代码抛出空指针异常。我尝试了一切来理解这个问题,但我唯一理解的是响应到了,但是用gson转换它有一个错误:
java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
这是响应(在模拟器和物理设备上相同):
{
"result": 1,
"announcementsList": null,
"years": [2018]
}
我变得疯了!
提前致谢
答案 0 :(得分:2)
可能导致此类问题的原因之一是Proguard! 调试应用程序时,模型与您看到的相同。所以Gson模型与服务器响应相同,一切正常。但是当你构建Apk时,它会变得模糊不清。所以类名和参数会发生变化。这就是为什么当你想用GSON解析它时它无法理解,结果是null。
您应该做的是告诉progurad防止更改您在GSON序列化中使用的模型。将此行添加到您的proguard规则中:
-keep class com.test.app.models.** { *; }
而不是com.test.app.models
输入包含其中所有模型的存储库的包名称
答案 1 :(得分:1)
我能想到的唯一可能的问题是你的职业卫士正在截断变量名。
所以将@SerializedName("years")@Expose
置于变量years