https响应上的Android奇怪行为

时间:2018-02-26 07:55:04

标签: android nullpointerexception gson android-volley

我已经失去了我的星期天试图了解我的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]
}

我变得疯了!

提前致谢

2 个答案:

答案 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

之上