2015-09-06 82 views
2

我正在使用Android Volley進行網絡調用。通常我使用JSONRequest來接收json數據,然後使用GSON將它們轉換爲對象。Android中的JsonRequest VS StringRequest Volley

new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         ///Convert response.toString() to POJO using GSON 
        } 
       }; 

如果我使用普通字符串請求,然後將字符串轉換爲使用GSON對象,那將是比JSONRequest多快?

new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
        ///Convert response to POJO using GSON 
        } 
       }; 

感謝

回答

5

這是使用StringRequest因爲返回的原始數據是字符串格式,JSONRequest字符串轉換爲JSONObject這是沒有必要爲你的情況更爲有效。

其實你可以實現你自己的GSONRequest,你可以google GSON volley爲許多參考。

下面是一個例子: making a GSON request using volley

0

正如我評論,對POJO類,你可以因爲你,如果你使用StringRequest做大量的工作創造如下面的代碼自定義請求。

這裏,我的POJO類是FileInfo,例如。

public class FileRequest extends Request<FileInfo> { 
    private final String mRequestBody; 
    private final Response.Listener<FileInfo> mListener; 
    private final Response.ErrorListener mErrorListener; 

    private static final String PROTOCOL_CHARSET = "utf-8"; 
    private static final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET); 

    public FileRequest(int method, String url, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.mRequestBody = null; 
     this.mListener = listener; 
     this.mErrorListener = errorListener; 
    } 

    public FileRequest(String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) { 
     super(requestBody == null ? Method.GET : Method.POST, url, errorListener); 
     this.mRequestBody = requestBody; 
     this.mListener = listener; 
     this.mErrorListener = errorListener; 
    } 

    public FileRequest(int method, String url, String requestBody, Response.Listener<FileInfo> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.mRequestBody = requestBody; 
     this.mListener = listener; 
     this.mErrorListener = errorListener; 
    } 

    @Override 
    protected Response<FileInfo> parseNetworkResponse(NetworkResponse response) { 
     try { 
      FileInfo fileInfo = new FileInfo(); 
      fileInfo.Size = Long.valueOf(response.headers.get("Content-Length")); 
      fileInfo.Type = response.headers.get("Content-Type"); 
      fileInfo.Modified = response.headers.get("Last-Modified"); 
      fileInfo.Data = response.data; 
      return Response.success(fileInfo, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    protected void deliverResponse(FileInfo response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    protected VolleyError parseNetworkError(VolleyError volleyError) { 
     return super.parseNetworkError(volleyError); 
    } 

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

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     try { 
      return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET); 
     } catch (UnsupportedEncodingException uee) { 
      VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", 
       mRequestBody, PROTOCOL_CHARSET); 
      return null; 
     } 
    } 
} 

希望這有助於!

+0

Thansk。但它給了什麼好處? –

+0

@AshwaniK:它將返回一個通用的JsonElement,然後您可以檢查它是否是JsonArray或JsonObject。當然,如果你不想這樣做,你可以創建一個類擴展請求 :) – BNK

+0

我認爲這個問題存在一些困惑。我的問題是,對於json請求,我們可以使用GSON將它轉換爲POJO來進行字符串請求。 –