【问题标题】:Parsing JSONArray using Gson + Volley not getting response使用 Gson + Volley 解析 JSONArray 没有得到响应
【发布时间】:2016-04-14 13:26:54
【问题描述】:

因此,我尝试使用 Google 的 Gson 库和 Volley 解析来自 json 的对象数组以进行 HTTP 请求。我的问题是,好像代码没有“命中”OnResponse 调用。我尝试在函数中添加一个简单的日志打印输出,以查看它是否有任何作用。

我的GsonRequest 课程直接来自Google's Training Docs。我根据对this question 的回答构建了这些方法。

这是我的代码:

private void runVolleyJson() throws AuthFailureError {
    GsonRequest<Meetings> getMeetings = new GsonRequest<Meetings>(AUTH_URL, Meetings.class, getHeaders(),
            createMyReqSuccessListener(),
            createMyReqErrorListener());
    helper.add(getMeetings);
}

private Response.Listener<Meetings> createMyReqSuccessListener() {
    return new Response.Listener<Meetings>() {
        @Override
        public void onResponse(Meetings response) {
            // NOTHING HAPPENS FROM HERE!
            try {
              Log.d("response", response.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
            // Do whatever you want to do with response;
            // Like response.tags.getListing_count(); etc. etc.
        }
    };
}

private Response.ErrorListener createMyReqErrorListener() {
    return new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Do whatever you want to do with error.getMessage();
        }
    };
}

public Map<String, String> getHeaders() throws AuthFailureError {
    HashMap<String, String> map = new HashMap<>();
    map.put("Content-Type", "application/json;");
    map.put("Authorization", "Bearer <sometoken>");
    return map;
}

绝对没有错误。它正在授权请求,但OnResponse 中没有任何反应,它似乎只是忽略了该功能。

现在我尝试使用标准的 StringRequest 和 volley,它可以完美运行,如下所示:

    private void runVolleyTest() {

    StringRequest request = new StringRequest(Request.Method.GET, AUTH_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray jsonarray = new JSONArray(response);
                        for(int i = 0; i < jsonarray.length(); i++) {
                                                            Gson gson = new Gson();
                            Meeting m = gson.fromJson(jsonarray.get(i).toString(), Meeting.class);
                            Log.e("Meeting", m.getMeetingId() + " " + m.getStatus());
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    ;
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    txtError(error);
                }
            }) {
        @Override
        public Map<String, String> getHeaders() {
            HashMap<String, String> map = new HashMap<>();
            map.put("Content-Type", "application/json;");
            map.put("Authorization", "Bearer <sometoken>");
            return map;
        }
    };

    //request.setPriority(Request.Priority.HIGH);
    helper.add(request);
}

【问题讨论】:

  • 尝试创建一个 JsonObjectRequest,然后使用 GSON 解析响应,以查看请求类本身是否存在错误。众所周知,Google 文档有一些过时的训练数据挥之不去。
  • is onErrorResponse 被调用?.. 如果是,日志是什么

标签: java android json gson android-volley


【解决方案1】:

尝试在开头添加这一行

RequestQueue helper = Volley.newRequestQueue(mContext);

【讨论】:

  • 这必须已经完成,否则 helper.add(getMeetings) 调用会引发 NPE
【解决方案2】:

添加这些行

 RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(stringRequest);

如果你不想在缓存中保存响应然后添加这个

requestQueue.add(stringRequest);

根据我的个人意见,如果您传递应用程序上下文会更好。

【讨论】:

  • 我认为这并不能真正回答问题,我的 helper.add 正在调用我的应用程序类中定义的请求队列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多