2015-09-06 62 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来进行字符串请求。 –