1

Volley ライブラリを使用して、Request オブジェクトを拡張し、GSON シリアライゼーションを実装しました。PUT次に、いくつかのリクエストをどのように処理したいかについて、その新しいオブジェクトを拡張しました。これは、GSON シリアライゼーションの最初のオブジェクトです。

@Override  
protected Response<t> parseNetworkResponse(NetworkResponse response) {  
    try {  
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //response may be too large for string?
        t parsedGSON = mGson.fromJson(jsonString, cls);
        Response <t> returnMessage = Response.success(parsedGSON,  
                HttpHeaderParser.parseIgnoreCacheHeaders(response));
        return returnMessage;

    } catch (UnsupportedEncodingException e) { 
        e.printStackTrace();
        return Response.error(new ParseError(e));  
    } catch (JsonSyntaxException je) {
        je.printStackTrace();
        Log.e("GsonRequest", je.getMessage()!=null?je.getMessage():"JsonSyntaxError");
        return Response.error(new ParseError(je));  
    }  
}  

ネットワークの応答が にResponse <t> returnMessage = Response.success(parsedGSON, HttpHeaderParser.parseIgnoreCacheHeaders(response));到達<t>すると、すべての変数がエラーなしで完全にシリアル化されて渡された正しいクラスがオブジェクトに取り込まれました。しかし、何らかの理由で Volley がジャンプし、ブレークポイントのデバッグやログの出力で} catch (JsonSyntaxException je) {の内容を明らかにすることができません。jeまた、私の拡張クラスでは:

 new ErrorListener() {
        @SuppressWarnings("unused")
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();

が呼び出されることはonErrorResponseありません(どちらも私のonResponseセクションではありません)

したがって、シリアル化が成功したときに Volley が JSONException をキャッチする理由がわかりません。また、Volley が Error オブジェクトを返さない理由もわかりません。

洞察力に感謝

4

3 に答える 3

3

答えは、拡張またはオーバーライドする Volley 関数には、

    @Override
protected void deliverResponse(T response) {
    // TODO Auto-generated method stub
    mListener.onResponse(response);
}

機能を実装。リスナーはコンストラクターで初期化され、onResponse メソッドが実装されている必要があります。

そうしないと、ネットワーク呼び出しがonResponseセクションに返されません。

編集: 拡張された Request クラスは、deliverResponse とともに、deliverError も実装する必要があります。

private final Listener<T> mListener;
private ErrorListener mErrorListener;

@Override
 public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}

コンストラクターでErrorListener初期化された

于 2014-02-06T17:20:39.783 に答える
1

私は今朝同じ問題を抱えていました。おそらく、応答として Json を受信して​​いません。サーバーは 200 OK で応答していますが、Volley は Json の受信を待っています。それよりも、Json を受信しない場合、そのエラーが生成されます。これには HTTP コードがないため (そうでないため)、ボレー内部エラーです。

リクエストを実行するための適切なオブジェクト (volley ライブラリから) を使用することで、問題を解決できる場合があります。

JsonObjectRequest volley を使用する場合、リクエストの本文に JSONObject が必要であり、レスポンス オブジェクトの JSONObject をアスペクトしています。JsonArrayRequest ボレーを使用する場合、リクエストに JSONArray が必要で、レスポンスに JSONArray が必要です。異なるケースごとに、応答を管理するために JsonRequest クラスを拡張する必要があります。

于 2014-02-04T15:37:31.957 に答える