2016-09-29 2 views
1

여기 새내기. 저는 솔라리스 원칙을 엄격하게 준수하고 디자인 패턴을 사용하여 클래스와 구성 요소를 분리 할 수있는 가장 깨끗하고 깨끗한 코드를 작성하기 위해 최선을 다하는 간단한 클라이언트 - 서버 Android 앱을 작업하고 있습니다. 나는 그것이 내가 작성해야하는 유일한 네트워크 코드 수 있습니다 바라고,이 방법을 썼다 : 내 불만으로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

관련 문제