0

サーバーからの応答が有効な JSON (html) ではないため、スタックしている Volley JSONRequest があります。

このエラーを適切に処理するにはどうすればよいでしょうか? 私はこの実装を持っています:

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 not found Web ページを返す場合です。

HTML (または XML) を取得しようとしている場合は、 a を使用しStringRequestて文字列を取得し、それを XML に変換するか、 a をDocument使用しSAXParserて解析することができます。例えば:

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 に答える