Created
January 9, 2017 02:47
-
-
Save beilly/85b27cf1010a418f28b05d4831b948a1 to your computer and use it in GitHub Desktop.
ProtoBuf的volley Request 支持
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.vcredit.utils.net; | |
import com.android.volley.AuthFailureError; | |
import com.android.volley.DefaultRetryPolicy; | |
import com.android.volley.NetworkResponse; | |
import com.android.volley.ParseError; | |
import com.android.volley.Request; | |
import com.android.volley.Response; | |
import com.android.volley.RetryPolicy; | |
import com.android.volley.toolbox.HttpHeaderParser; | |
import com.google.protobuf.Message; | |
import com.vcredit.global.InterfaceConfig; | |
import java.util.HashMap; | |
import java.util.Map; | |
/** | |
* Created by shibenli on 2017/1/6. | |
*/ | |
public class ProtoBufRequest<ReqT extends Message, RespT extends Message> extends Request<RespT> { | |
private ReqT request; | |
private final Class<RespT> responseType; | |
private final Response.Listener<RespT> listener; | |
private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; | |
private static final int SOCKET_TIMEOUT = 30000; | |
public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, | |
Response.Listener<RespT> listener, Response.ErrorListener errorListener) { | |
super(method, url, errorListener); | |
this.listener = listener; | |
this.request = data; | |
this.responseType = responseType; | |
} | |
@Override | |
public Map<String, String> getHeaders() throws AuthFailureError { | |
Map<String, String> headers = new HashMap<String, String>(); | |
headers.put("Charset", "UTF-8"); | |
headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); | |
headers.put("Accept", PROTOCOL_CONTENT_TYPE); | |
headers.put("Accept-Encoding", "gzip,deflate"); | |
headers.put("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"); | |
return headers; | |
} | |
@Override | |
public byte[] getBody() throws AuthFailureError { | |
if (request == null) { | |
return super.getBody(); | |
} | |
return request.toByteArray(); | |
} | |
@Override | |
protected Response<RespT> parseNetworkResponse(NetworkResponse response) { | |
try { | |
if (responseType == null) { | |
throw new IllegalArgumentException("The response type was never provided."); | |
} | |
RespT responseInstance = responseType.newInstance(); | |
return (Response<RespT>) Response.success( | |
responseInstance.newBuilderForType().mergeFrom(response.data).build(), | |
HttpHeaderParser.parseCacheHeaders(response)); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
return Response.error(new ParseError(e)); | |
} | |
} | |
@Override | |
public String getBodyContentType() { | |
return PROTOCOL_CONTENT_TYPE; | |
} | |
@Override | |
public RetryPolicy getRetryPolicy() { | |
RetryPolicy retryPolicy = new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, | |
InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF); | |
return retryPolicy; | |
} | |
@Override | |
protected void deliverResponse(RespT response) { | |
listener.onResponse(response); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment