2016-09-29 3 views
1

ここで初心者です。 私は、友人とシンプルなクライアントサーバーのAndroidアプリを開発しています。私はできる限りクリーンで最も美しいコードを書いています。厳密にはSOLIDの原則に従い、デザインパターンを使用してクラスとコンポーネントを切り離します。私はそれが私が書く必要があるでしょう唯一のネットワークコードになるだろうことを期待して、この方法を書いた:私の不満にVolley:JSONArrayRequestとJSONObjectRequestの両方を処理するメソッドを作成します。

private void VolleyJSONPostParserRequest(String url, JSONObject requestBody, 
    final Handler handler, final IParser replyParser) { 
     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest 
      (Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) {  
       try { 
        Object parsedResponse = replyParser.parse(response.toString()); 
        notifyObservers(handler, parsedResponse); 
       } catch (Exception e) { 
        Log.e(TAG,handler.getClassName() + " reply parsing error!"); 
        notifyObservers(handler, null); } 
       } 
       }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
       Log.e(TAG,"Error receiving response for " + handler.getClassName()); 
       notifyObservers(handler, null); 
       } 
       }); 
     } 

、私は時々、サーバの応答はJSONObjectになり、時にはそれがすることが分かりましたJSONArrayです。私は全体をコピーして貼り付け、 "JsonObjectRequest"を "JsonArrayRequest"に置き換えたくありません。この問題の良い解決策は何ですか?それとも、コピーして貼り付けたほうがいいのでしょうか?

答えて

1

IMOでは、カスタムリクエスト(たとえば、public class CustomRequest extends Request<NetworkResponse>)を実装する必要があります。詳細については、次のGoogleのトレーニングドキュメントをお読みください:

Google Volley - Implementing a Custom Request

そして...

@Override 
public void onResponse(NetworkResponse response) { 
    try { 
     final String jsonString = new String(response.data, 
       HttpHeaderParser.parseCharset(response.headers)); 
     // Check if it is JSONObject or JSONArray 
     Object json = new JSONTokener(jsonString).nextValue();   
     if (json instanceof JSONObject) { 
      //do something... 
     } else if (json instanceof JSONArray) { 
      //do something... 
     } else { 
      //do something... 
     } 
     ... 
    } catch (UnsupportedEncodingException | JSONException e) { 
     e.printStackTrace(); 
    } 
} 

はそれが役に立てば幸い!

+1

@ranysこんにちは!代わりに 'StringRequest'を試してみてください。私の答えは上記の' NetworkResponse'が 'String'に変換されているからです。 – BNK

関連する問題