0

我有一个 Volley JSONRequest 卡住了,因为来自服务器的响应不是有效的 JSON(它是 html)。

如何优雅地处理这个错误?我有这个实现:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            … something …   
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub
            Log.i(TAG,"error "+error.toString());
        }
    });
    queue.add(jsObjRequest);

但是,当我发送请求并获得无效的 JSON 响应时,不会调用 onErrorResponse。相反,我得到了一个例外

08-14 16:26:15.590: D/538 - JsonRequest(27888): exception error Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

整个应用程序崩溃。

我设法将该错误跟踪到 JsonObjectRequest.java 类中的以下行:

 @Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {

        Log.d(TAG,"response headers "+response.headers.toString());
        String jsonString =
            new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        Log.d(TAG,"json string "+jsonString);
        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        Log.d(TAG,"parse error");
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        Log.d(TAG,"exception error "+je.getLocalizedMessage());
        return Response.error(new ParseError(je));
    }
}

被调用的行是:return Response.error(new ParseError(je));

我如何抓住它,以免应用程序崩溃?

提前致谢!

4

2 回答 2

1

如果您希望获得 JSON,则应检查您的 URL 是否有效。当请求无效时,通常会返回 HTML。此类示例是当请求返回404 未找到网页时。

如果您正在尝试获取 HTML(或 XML),您可以使用 aStringRequest来获取一个字符串,然后将其转换为 XMLDocument或者可以使用 aSAXParser来解析它。例如:

StringRequest request = new StringRequest(Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            Document xml = factory.newDocumentBuilder().parse(response);
            //TODO: handle XML Document parsing
        } catch (Throwable t) {
            return ;
        }
    }
}, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO Auto-generated method stub

        }

});

queue.add(request);

您可能希望将其视为更简单的替代方案的一件事是droidQuery要使用droidQuery完成此请求:

$.ajax(new AjaxOptions().url(url)
                        .type("GET")
                        .dataType("XML")
                        //optionally, add own SAX parser with SAXContentHandler or customXMLParser methods
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                Document xml = (Document) params[0];
                                //TODO: parse Document
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                Log.e("$", "Error " + error.status + ": " + error.error);
                            }
                        }));
于 2013-08-14T14:57:22.417 回答
0
} catch (JSONException je) {
    Log.v("Volley", "JSONException " + response.statusCode);
    if (response.statusCode == 200)// Added for 200 response
        return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
    else
        return Response.error(new ParseError(je));
}

尝试添加此捕获

于 2014-05-21T20:20:12.013 回答