【问题标题】:Android strange behavior on https responsehttps响应上的Android奇怪行为
【发布时间】:2018-02-26 07:55:04
【问题描述】:

我已经失去了周日试图了解我的 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)上,一切正常。然后我尝试在同一个 Vernee 设备上通过 google play store(alpha 测试)安装应用程序,代码抛出空指针异常。我尝试了一切来理解问题,但我唯一理解的是响应已经到达,但是使用 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]
}

我快疯了!

提前致谢

【问题讨论】:

    标签: android nullpointerexception gson android-volley


    【解决方案1】:

    可能导致此类问题的原因之一是 Proguard ! 当您调试应用程序时,模型与您看到的一样。所以 Gson 模型与服务器响应相同,一切正常。但是,当您构建 Apk 时,它会变得模糊不清。所以类名和参数会改变。这就是为什么当你想用 GSON 解析它时它无法理解并且结果为 null。

    您应该做的是告诉程序防止更改您在 GSON 序列化中使用的模型。将此行添加到您的 proguard 规则中:

    -keep class com.test.app.models.** { *; }
    

    不要输入com.test.app.models,而是输入所有模型所在的存储库的包名称

    【讨论】:

    • 太棒了。问题是职业后卫。非常感谢您的解决方案!
    【解决方案2】:

    我能想到的唯一可能的问题是你的 pro Guard 正在截断变量名。

    所以把@SerializedName("years")@Expose放在你的变量years上方

    【讨论】:

    • 您的解决方案也不错,但我只能检查一个答案是否有效:(谢谢!
    • @Giamma 不客气,你总是可以投票多于回答;-p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2013-04-23
    相关资源
    最近更新 更多